一、栈的定义
栈(statck)这种在计算机中是相当出名的。栈中的数据是先进后出的(First In Last Out, FILO)。栈只有一个出口,允许新增元素(只能在栈顶上增加)、
移出元素(只能移出栈顶元素)、取得栈顶元素等操作。在STL中,栈是以别的容器作为底部结构,再将接口改变,使之符合栈的特性就可以了。
二、代码实现
1 // main.c 2 // C 语言-栈 3 // 4 // Created by rimi on 2017/5/22. 5 // Copyright © 2017年 rimi. All rights reserved. 6 // 7 8 #include9 #include 10 #include 11 struct Data{ //因为两个相邻之间的关系需要维护 12 int i; 13 struct Data * next; 14 15 }; 16 17 18 struct Stack{ 19 struct Data *pTop;//栈顶指针 20 struct Data *pBottom;//栈底指针 21 int maxNumber;//栈里面最多放几个元素 22 int currentNumber;//栈当前元素个数 23 24 }; 25 struct Data * newData();//初始化一个Date 26 struct Stack * initStack();//初始化一个栈 27 bool push(struct Stack * stack,struct Data *data);//压栈、进栈 28 void pop(struct Stack * stack);//出栈 29 void traverse(struct Stack * stack);//遍历栈里面的所有元素 30 bool isEmpty(struct Stack * stack); 31 bool isFull(struct Stack * stack); 32 33 int main(int argc, const char * argv[]) { 34 struct Stack * stack=initStack(5); 35 while (push(stack,newData() )){ 36 } 37 traverse(stack); 38 pop(stack); 39 pop(stack); 40 pop(stack); 41 traverse(stack); 42 return 0; 43 } 44 //初始化一个data 45 struct Data * newData(){ 46 struct Data * data=(struct Data *)malloc (sizeof(struct Data)); 47 data->next=NULL; 48 printf("请输入一个元素值(一个整数):"); 49 scanf("%d",&data->i); 50 return data; 51 52 } 53 //初始化一个栈 54 struct Stack * initStack(int max){ 55 struct Stack * stack=(struct Stack *)malloc (sizeof(struct Stack)); 56 stack->pTop=NULL; 57 stack->pBottom=NULL; 58 stack->maxNumber=max; 59 stack->currentNumber=0; 60 return stack; 61 62 } 63 //判断是否为满(为满返回true,不为满false) 64 bool isFull(struct Stack * stack){ 65 if(stack ->currentNumber ==stack->maxNumber) { 66 67 return true; 68 69 } 70 return false; 71 } 72 73 74 //压栈、进栈 75 bool push (struct Stack * stack,struct Data *data){ 76 if(isFull(stack)){ 77 printf("栈已满了"); 78 return false; 79 80 } 81 if(data ->i==-1){ 82 return false; 83 } 84 if(stack->pTop== NULL && stack ->pBottom ==NULL){ 85 86 stack ->pTop=data; 87 stack->pBottom=data; 88 }else{ 89 data->next=stack->pTop; 90 stack->pTop=data; 91 } 92 stack->currentNumber++; 93 return true; 94 } 95 //判断是否为空 96 bool isEmpty(struct Stack * stack){ 97 if(stack ->pBottom == NULL && stack ->pTop ==NULL) { 98 return true; 99 }100 return false;101 }102 103 104 105 //弹出栈顶元素106 void pop (struct Stack * stack){107 if(!isEmpty(stack)) {108 struct Data *data=(stack )->pTop;109 printf("元素:%d 出栈 \n",data->i);110 stack->pTop = stack ->pTop->next;111 free(data);112 113 }114 115 }116 //遍历打印栈中的元素117 void traverse (struct Stack *stack){118 printf("=================== \n");119 int index=0;120 struct Data * temp =stack ->pTop;121 while(temp !=NULL){122 printf("第%d个输出的元素是:%d \n",++index,temp->i);123 temp = temp->next;124 }125 printf("=================== \n");126 }