代码改变世界

C语言数据结构-栈

2017-10-14 10:17  晨曦曙光  阅读(271)  评论(0编辑  收藏  举报

一、栈的定义

栈(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 #include <stdio.h>
  9 #include<stdlib.h>
 10 #include<stdbool.h>
 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 }