栈的基本操作有栈的初始化、插入数据、删除数据以及遍历栈。
栈的特点是先进后出,因此先插入的数据在遍历的时候最后被输出。删除数据的时候,先删除后插入的数据。
如下图所示:
结构体定义代码:(这是其中一种定义结构体的方法)
typedef struct Stack{ int *top; int *bottom; int Stack_size; }Stack;
相应的操作对应的代码为:
//初始栈
int InitStack(Stack *stack){ stack->bottom=(int *)malloc(SIZE*sizeof(int)); stack->top=stack->bottom; stack->Stack_size=SIZE; return OK; }
//插入数据
int Push(Stack *stack,int data){ if(stack->top-stack->bottom>=stack->Stack_size){ printf("栈已满,不能插入数据"); } *stack->top=data; stack->top++; return OK; }
//删除数据
int Pop(Stack *stack){ if(stack->bottom==stack->top){ printf("栈为空,不能删除数据"); } stack->top--; printf("%d\n",*stack->top); return OK; }
//遍历栈
int print(Stack *stack) { while(stack->bottom!=stack->top){ stack->top--; printf("%d",*stack->top); } return OK; }
完整代码为:
1 #define OK 1 2 #define ERROR 0 3 #define SIZE 100 4 typedef struct Stack{ 5 int *top; 6 int *bottom; 7 int Stack_size; 8 }Stack; 9 //初始栈 10 int InitStack(Stack *stack){ 11 stack->bottom=(int *)malloc(SIZE*sizeof(int)); 12 stack->top=stack->bottom; 13 stack->Stack_size=SIZE; 14 return OK; 15 } 16 //插入数据 17 int Push(Stack *stack,int data){ 18 if(stack->top-stack->bottom>=stack->Stack_size){ 19 printf("栈已满,不能插入数据"); 20 } 21 *stack->top=data; 22 stack->top++; 23 return OK; 24 } 25 //删除数据 26 int Pop(Stack *stack){ 27 if(stack->bottom==stack->top){ 28 printf("栈为空,不能删除数据"); 29 } 30 stack->top--; 31 printf("%d\n",*stack->top); 32 return OK; 33 } 34 //遍历栈 35 int print(Stack *stack) 36 { 37 while(stack->bottom!=stack->top){ 38 stack->top--; 39 printf("%d",*stack->top); 40 } 41 return OK; 42 } 43 int main() 44 { 45 Stack a; 46 InitStack(&a); 47 Push(&a,1); 48 Push(&a,2); 49 Push(&a,3); 50 printf("删除的元素是:"); 51 Pop(&a); 52 printf("剩余的元素是:"); 53 print(&a); 54 return 0; 55 }
运行结果如图所示: