1. 什么是栈?
**堆栈(stack)**: 具有一定操作约束的线性表
而用C语言实现栈,一共有三种方式:
1. 用静态数组实现栈。
2. 用动态数组实现栈。
3. 用链表实现栈。
三种方法各有自己的优缺点,而在此篇文章中,我们用静态数组实现栈。即栈的长度已经是人为实现固定了的。
首先,我们要先导入所需的库:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
然后我们定义一个结构体用以存储栈里面的数据 data 和一个指向栈顶的标志 top:
#define MAXSIZE 128
typedef int elementType;
typedef struct SNode *Stack;
struct SNode{
elementType data[MAXSIZE]; //声明一个静态数组,用于堆栈
int top; //标志栈顶
};
压数据入栈操作:(此处要先判断栈是否已满,如果满了就返回空)
void Push(Stack PtrS, elementType iterm){
if(PtrS->top == MAXSIZE-1){ //栈堆满了
printf("堆栈满了");
return;
}
else{
PtrS->data[++(PtrS->top)] = iterm;
return;
}
}
上面的这行代码:
PtrS->data[++(PtrS->top)] = iterm;
可以分开写成:
++(PtrS->top);
PtrS->data[PtrS->top] = iterm;
意思都是一样的,就是先让指向原本栈顶的再向上挪一位,因为有新数据入栈。
下面是出栈操作:
elementType Pop(Stack PtrS){
if(PtrS->top == -1){
printf("堆栈空的");
return 0;
}
else{
return (PtrS->data[(PtrS->top)--]);
}
}
此出栈函数和入栈差不多,开始要判断栈是不是为空。因为我们事先设定如果栈为空,top = -1 这个函数要返回一个数据,即我们想要弹出的数据,这里我们弹出的是elementType 即 int 类型。
下面是初始化一个栈的程序:
Stack InitStack(){
Stack PtrS = (Stack)malloc(sizeof(struct SNode));
PtrS->top = -1;
return PtrS;
}
我们先要用 malloc 函数返回一个指向Stack类型(即struct SNode *)的地址空间,将地址赋给PtrS指针变量, 而且开始的时候我们要设置top = -1 然后返回这个指针。
接下来是主程序用于测试:
void main(){
int n, m;
Stack temp = InitStack();
Push(temp, 12);
Push(temp, 23);
n = Pop(temp);
m = Pop(temp);
printf("%d\n",n);
printf("%d\n",m);
}
先压入12 , 再压入23,然后弹出栈顶的数据(即23),再弹出一个数据(即12)。我们发现结果正确: