1. LinkedStack 链式栈
#include<stdio.h>
#include<stdlib.h>
#define ERROR -1
typedef int ElementType;
typedef struct SNode * Stack;
//定义结点结构
struct SNode{
ElementType Data;
Stack Next;
};
//链表初始化,创建一个头结点
Stack MakeEmpty(){
Stack S=(Stack)malloc(sizeof(struct SNode));//申请结点空间
S->Next=NULL;//头结点的指针域为空
return S;//返回申请空间的地址
}
//入栈,每次入栈都是插入到头结点的后面
bool Push(Stack S,ElementType X){
Stack p=(Stack)malloc(sizeof(struct SNode));//创建一个新的结点
if(p){//若申请到结点
p->Data=X;//给结点的数据域赋值X
p->Next=S->Next;//p的指针域指向原来头结点的next
S->Next=p;//p成为头结点S的next
return true;
}
return false;
}
//出栈 ,每次出栈都是删除头结点后的结点
ElementType Pop(Stack S){
if(S->Next==NULL) return ERROR;//头结点的指针域为空,代表栈空,返回一个错误标志
Stack p=S->Next;//结点p是头结点后面的结点,也是要删除的结点
ElementType X=p->Data;//用变量X记录p的data
S->Next=p->Next;//头结点的next指向要p后的结点
free(p);//释放结点p
return X; //返回出栈的元素
}
//栈的销毁
void Destroy(Stack S){
Stack p=S->Next;//p指向头结点后面的结点
while(p){//若p不为空
S->Next=p->Next;//头结点指向p后的结点
free(p);//释放p
p=S->Next;//p指向当前头结点后面的结点,继续循环判定
}
free(S);//最后释放头结点
}
int main(){
Stack S=MakeEmpty();
Push(S,33);
Push(S,66);
printf("data=%d",Pop(S));
Destroy(S);
}
2. ArrayStack 顺序栈
#include<stdio.h>
#include<stdlib.h>
#define ERROR -1
#define MaxSize 10
typedef int ElementType;
typedef struct SNode * Stack;
struct SNode{
ElementType Data[MaxSize];//存储数据的一维数组
int Top;//指向栈顶位置
};
//空间初始化
Stack MakeEmpty(){
Stack S=(Stack)malloc(sizeof(struct SNode));//申请空间
S->Top=-1;//初始化栈顶位置为-1
return S;//返回申请空间的地址
}
//判定栈是否满
bool IsFull(Stack S){
return S->Top==(MaxSize-1);
}
//将元素X入栈
bool Push(Stack S,ElementType X){
if(IsFull(S)){
return false;
}
else{
S->Data[++S->Top]=X;//将栈顶位置加1,并给新的栈顶位置赋值X
return true;
}
}
//判定栈是否为空
bool IsEmpty(Stack S){
return S->Top==-1;
}
//出栈
ElementType Pop(Stack S){
if(IsEmpty(S)) return ERROR;//空的话返回一个代表错误的值
else{
return S->Data[S->Top--]; //取栈顶的元素,然后将栈顶指针减1
}
}
int main(){
Stack S=MakeEmpty();
Push(S,22);
Push(S,33);
Push(S,44);
Push(S,55);
printf("data=%d\n ",Pop(S));
free(S);
return 0;
}