#include<stdio.h>
 #include<stdlib.h>
 typedef int Elemtype;
 #define maxsize 100
 typedef struct stack
 {
 Elemtype nodes[maxsize];//表示栈的最大容量
 int top;//表示栈顶指针的位置
 int length;//表示当前栈所存储的元素的个数
 }stack;
 stack* initstack();//栈的初始化
 bool isfullstack(stack*);//判断栈是否已满
 bool isemptystack(stack*);//判断栈是否已空
 void pushstack(stack*, int);//压栈
 void popstack(stack*, int*);//出栈
 void calcluate(stack*);//计算栈的元素的个数
 int gettop(stack*);//取栈顶元素
 void traverse(stack*);//遍历栈的所有元素
 int main(void)
 {
 int val = 0;
 stack* s = initstack();/初始化栈,返回的是初始化栈后的的地址/
 pushstack(s, 1);//将1入栈
 pushstack(s, 2);//将2入栈
 pushstack(s, 3);//将3入栈
 pushstack(s, 4);//将4入栈
 traverse(s);//遍历
 calcluate(s);//计算栈的元素的个数
 popstack(s, &val);//出栈并将栈顶元素保存在val中
 printf(“出栈元素为%d\n”, val);
 traverse(s);
 gettop(s);//获取栈顶元素
 calcluate(s);
 system(“pause”);
 /将程序停留在一个黑色的窗口,避免控制台一闪而过,看不到执行的效果/
 return 0;//程序正常进行返回一个0
 }
 stack* initstack()
 {
 stacksQ = (stack)malloc(sizeof(stack));
 if (!sQ)
 {/如果sQ等于NULL,说明分配内存不成功,那么直接返回就行了/
 printf(“分配内存空间失败\n”);
 return 0;
 }
 else
 {
 sQ->length = 0;//将栈的长度置为0
 sQ->top = 0;//将栈顶元素的下标指向为0
 printf(“栈已初始化\n”);
 }
 return sQ;
 }
 bool isfullstack(stackSQ)
 {//已满或为空就返回真
 if (SQ->length >= maxsize)
 {
 return true;
 }
 else
 {
 return false;
 }
 }
 bool isemptystack(stacksQ)
 {
 if (sQ->length == 0)
 {
 return true;
 }
 else
 {
 return false;
 }}
 void pushstack(stacksQ, int val)
 {
 if (!isfullstack(sQ))
 {
 //如果栈没有满才入栈
 sQ->nodes[sQ->top] = val;
 sQ->top ++;
 sQ->length++;
 //在入栈之后一定记得要将记录栈的元素个数的计算器length++
 }
 printf("%d已入栈成功\n", val);
 }
 void popstack(stacksQ, intval)
 {
 if (isemptystack(sQ))
 {//在栈为空的时候才出栈
 printf(“栈为空\n”);
 return;//用return让程序返回掉,因为栈空我们//不能被取得栈的元素了,只能返回
 }
 else
 {
val = sQ->nodes[sQ->top-1];
 sQ->top–;
 sQ->length–;//再取得栈顶元素之后记得一定要将统计栈的元素的计算机length–
 }
 }
 void calcluate(stacksQ)
 {
 int m = sQ->top;//注意不能改变栈顶指针的任何数据
 int count = 0;//计数器
 while (m!= 0)/下标位置为0是没有数据的,所以用0作为循环结束的判断条件/
 {/由于本程序中刚开始m就指向0这个位置,而这个位置是可以存储数据的,那么本程序中的top就指向最后一个元素的下一个位置;还有一种情况是,top刚开始指向了一个没有用的元素(这个时候我们同行将该top令为-1),那么top之后就会指向栈底元素的下一个位置,我们应该注意区别~!!!/
 count++;
 m–;
 }
 printf(“有%d个数据\n”, count);
 }
 int gettop(stacksQ)
 {
 /注意取栈顶元素必须线判断栈是否为空,如果不为空才能取得栈顶元素/
 if (isemptystack(sQ))
 {
 printf(“栈为空,无法取得栈顶元素\n”);
 return 0;
 }
 else
 {
 return sQ->nodes[sQ->top - 1];
 /*为什么sQ->nodes[sQ->top - 1],该数组的下标需要减一::因为sQ->top - 1才是最后一个元素的位置,上面已经讲的很详细了,这里就不详细解释 /
 }
 }
 void traverse(stacksQ)
 {/注意在遍历的时候,我们所做的操作只是遍历而已,我们不应该改变原先栈的相关信息,比如栈的top的位置,所以我们应该刚开始将top的值赋给一个整型的变量,本程序中是将top的值给m/
 int m = sQ->top;
 int val = 0;
 while (1)
 {
 if (isemptystack(sQ))
 {
 printf(“栈为空,,无法进行遍历\n”);
 return;
 }
 if (m == 0)
 {
 printf(“遍历完成\n”);
 break;
 /当我们已经遍历了最后一个元素之后,m就等于0了,程序结束了,那么m等于0就是遍历结束的条件/
 }
 else
 {//m表示栈顶元素的下一个位置
 //所以取得栈顶元素需要下标-1
 val = sQ->nodes[m - 1];
 m = m --;
 printf("%d\t", val);
 }
 }
 //我们不能直接通过sQ->top进行操作,因为我们
 //不能改变top的位置,只能将他赋给一个变量
 //有那个变量对其进行相应的操作
 }