栈是一种受一定操作限制的数据结构:只能从一端插入,删除。
具有后入先出的特点。
实例:洗碗后,最后摞上去的碗,将会在下次使用时被第一个使用,如果想用下面的,就得把最后一个先拿下来。
1.顺序实现
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct SNode* Stack;
struct SNode{
int data[MAX];//储存数据
int top;//指向栈顶
};
//初始化一个空栈
Stack Init(){
Stack Ptrs=(Stack)malloc(sizeof(SNode*));
Ptrs->top=-1;//初始化栈顶为-1
return Ptrs;
}
//入栈
void Push(Stack Ptrs,int x){
if(Ptrs->top==MAX-1){
printf("堆栈已满");
}else{
Ptrs->data[++(Ptrs->top)]=x;
}
}
//出栈
int Pop(Stack Ptrs){
if(Ptrs->top==-1){
return 0;
}else{
return Ptrs->data[(Ptrs->top)--];
}
}
//返回栈顶元素
int Top(Stack Ptrs){
return Ptrs->data[Ptrs->top];
}
1_1.用一个数组实现两个堆栈,最大利用数组空间
最大利用数组空间,即数组只要还有空间,入栈操作就不会报错(尽管是一个栈已满,另一个栈未满的情况);
也就是,一个栈的栈顶是数组开头,另一个栈的栈顶是数组末尾。
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct SNode* Stack;
struct SNode{
int data[MAX];//储存数据
int top;//指向第一个栈的栈顶
int rear;//指向第二个栈的栈顶
};
//初始化一个空栈
Stack Init(){
Stack Ptrs=(Stack)malloc(sizeof(SNode*));
Ptrs->top=-1;//初始化第一个栈顶为-1
Ptrs->rear=MAX;//初始化第二个栈顶为MAX
return Ptrs;
}
//入栈 ,flag是入第一个栈还是第二个栈的标志
void Push(Stack Ptrs,int x,int flag){
//两个栈顶已经挨着了,栈满
if(Ptrs->rear-Ptrs->top==1){
printf("堆栈已满");
}else if(flag==1){
Ptrs->data[++(Ptrs->top)]=x;
}else{
Ptrs->data[--(Ptrs->rear)]=x;
}
}
//出栈
int Pop(Stack Ptrs,int flag){
if(flag==1){
if(Ptrs->top==-1){
printf("堆栈为空");return 0;
}else{
return Ptrs->data[Ptrs->top--];
}
}else{
if(Ptrs->rear==MAX){
printf("堆栈为空");return 0;
}else{
return Ptrs->data[Ptrs->rear++];
}
}
}
//返回栈顶元素
int Top(Stack Ptrs,int flag){
if(flag==1)
return Ptrs->data[Ptrs->top];
else
return Ptrs->data[Ptrs->rear];
}
2.链式实现
栈的链式存储实际是一个单链表,插入和删除操作只能在栈顶进行,故next指针须指向栈顶,插入和删除都是在链表尾部进行。
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct SNode* Stack;
struct SNode{
int data;
Stack next;//指向栈顶
};
//初始化一个空栈
Stack Init(){
Stack Ptrs=(Stack)malloc(sizeof(SNode*));
Ptrs->next=NULL;
return Ptrs;
}
//创建一个新结点
Stack creat_node(int x){
Stack s=(Stack)malloc(sizeof(SNode*));
s->data=x;
s->next=NULL;
return s;
}
//判断是否栈空
int Empty(Stack Ptrs){
return Ptrs->next==NULL;
}
//入栈
void Push(Stack Ptrs,int x){
Stack s=creat_node(x);
s->next=Ptrs->next;
Ptrs->next=s;
}
//出栈
int Pop(Stack Ptrs){
if(Empty(Ptrs)){
printf("堆栈为空");return 0;
} else{
int t;
Stack temp=Ptrs->next;
Ptrs->next=temp->next;
t=temp->data;
free(temp);
return t;
}
}
//测试
int main()
{
Stack Ptrs=Init();
Push(Ptrs,1);
Push(Ptrs,2);
printf("%d",Pop(Ptrs));
printf("%d",Pop(Ptrs));
printf("%d",Pop(Ptrs));
}