什么是堆栈(顺序和链式)

本文介绍了栈数据结构的两种实现方式:顺序存储和链式存储。顺序存储中,栈可以是一个固定大小的数组,也可以通过调整两个栈在数组中的位置来最大化空间利用率。链式存储则利用单链表实现,插入和删除操作都在链表尾部进行。文章还提供了相应的C语言代码示例。
摘要由CSDN通过智能技术生成

栈是一种受一定操作限制的数据结构:只能从一端插入,删除。

具有后入先出的特点。

实例:洗碗后,最后摞上去的碗,将会在下次使用时被第一个使用,如果想用下面的,就得把最后一个先拿下来。

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));
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xxx_xiyuyu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值