栈,是限定仅在表尾进行插入或删除操作的线性表。(栈就像一个杯子),,表头是栈底,表尾是栈顶。需要注意的是,栈是先进后出,后进先出。

 同样,和线性表类似,栈也有两种储存表示方法(这里就用顺序栈的模块说明)

 1 #include <stdlib.h>
 2 #include <stdio.h>
 3 
 4 /****** 宏定义 ******/
 5 #define ERROR 0
 6 #define OVERFLOW -2
 7 #define OK 1
 8 #define STACK_INIT_SIZE 100    //存储空间初始分配量
 9 #define STACKINCREMENT 10    //存储空间分配增量
10 
11 /******** 取别名 *********/
12 typedef int SElemType;    //所需存的元素的类型
13 typedef int Status;
14 
15 /******** 栈的定义 *******/
16 typedef struct{
17     SElemType *base;    //栈的基地址,也就是栈底指针
18     SElemType *top;        //栈定指针
19     int stacksize;        //当前已分配的储存空间,就是最大能存储的数量
20 }SqStack;
21 
22 /********* 构建一个空栈 *******/
23 Status InitStack(SqStack &S){
24     S.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));    //分配内存给S.base
25     if (!S.base) exit(OVERFLOW);    //存储分配失败
26     S.top = S.base;    //初始时,栈顶=栈底
27     S.stacksize = STACK_INIT_SIZE;    //当前最大存储量就是初始分配量
28     return OK;
29 }
30 
31 /********** 用e返回栈顶元素 ********/
32 Status GetTop(SqStack &S, SElemType &e){
33     if (S.top == S.base)
34         return ERROR;     //栈为空,ERROR
35     e = *(S.top - 1);    //栈顶指针的下一位就是栈顶元素
36     return OK;
37 }
38 
39 /********** 插入e为新的栈顶元素 ******/
40 Status Push(SqStack &S, SElemType e){
41     if (S.top - S.base >= S.stacksize){    //栈满,增加空间
42         S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(SElemType));
43         if (!S.base)
44             exit(OVERFLOW);
45         S.top = S.base + S.stacksize;    //栈顶指针的位置在栈底向上移 S.stacksize 个
46         S.stacksize += STACKINCREMENT;    //储存空间增大了  STACKINCREMENT 个
47     }
48     *S.top++ = e;    //栈顶指针的位置放值元素e, 然后上移一个
49     return OK;
50 }
51 
52 /********** 删除栈顶元素,并用e返回其值 ******/
53 Status Pop(SqStack &S, SElemType &e){
54     if (S.top == S.base)    //若为空
55         return ERROR;    
56     e = *--S.top;        //栈顶指针下移一个,并把值给e
57     return OK;
58 }
59 
60 int main(){
61     //
62     return 0;
63 }
原文地址:https://www.cnblogs.com/ouyang_wsgwz/p/7748058.html