数据结构考研一练习day3-c语言顺序栈与链栈

本文介绍了使用C语言实现顺序栈和链栈的基本操作,包括初始化、判断栈空、进栈、出栈和读取栈顶元素。顺序栈基于数组,链栈基于单链表,分别给出了详细代码示例。对于顺序栈,提到了其容量限制的问题,而链栈则更灵活。

简介:采用c语言,但是在此代码中函数返回类型中采用了bool,如果需要以c文件运行,将bool类型改为int即可

作者备战考研,以此督学,希望大家多多指教呢

写在前面:链栈采用了带头结点的单链表实现

目录

顺序栈

一.顺序栈的结构体定义为

二.初始化一个空栈

三.判断一个栈是否为空

四.进栈

五.出栈

六.读取栈顶元素

顺序栈实例全部

链栈

一.顺序栈的结构体定义为

二.初始化一个空栈

三.判断一个栈是否为空

四.进栈

五.出栈

六.读取栈顶元素

链栈实例全部

总结


顺序栈

一.顺序栈的结构体定义为

typedef struct {
	ElemType data[Maxsize];
	int top;
}Sqstack;

二.初始化一个空栈

void InitStack(Sqstack *s){
	s->top=-1;
} 

三.判断一个栈是否为空

若栈空则返回true,否则返回false

bool Stackempty(Sqstack s){
	if(s.top==-1)return  true;
	return false;
}

四.进栈

前提条件:需判断是否栈满

bool Push(Sqstack *s,ElemType x){
	if(s->top==Maxsize-1)return 1;
	s->data[++s->top]=x;
	return true;
}

五.出栈

前提条件:需判断是否栈空

bool Pop(Sqstack *s,ElemType *x){
	if(Stackempty(*s))return false;
	*x=s->data[s->top--];
	return true;
}

六.读取栈顶元素

前提条件:需判断是否栈空

bool GetTop(Sqstack s,ElemType *x){
	if(Stackempty(s))return false;
	*x=s.data[s.top];
	return true;
}

顺序栈实例全部

//栈的基本操作,c语言顺序栈 
#include<stdio.h> 
#define ElemType int  
#define Maxsize 100
typedef struct {
	ElemType data[Maxsize];
	int top;
}Sqstack;

//初始化一个空栈
void InitStack(Sqstack *s){
	s->top=-1;
} 
//判断一个栈是否为空,若栈空则返回true,否则返回false
bool Stackempty(Sqstack s){
	if(s.top==-1)return  true;
	return false;
}
//进栈,需判断是否栈满
bool Push(Sqstack *s,ElemType x){
	if(s->top==Maxsize-1)return 1;
	s->data[++s->top]=x;
	return true;
}
//出栈,需判断是否栈空
bool Pop(Sqstack *s,ElemType *x){
	if(Stackempty(*s))return false;
	*x=s->data[s->top--];
	return true;
}
//读取栈顶元素,前提栈非空
bool GetTop(Sqstack s,ElemType *x){
	if(Stackempty(s))return false;
	*x=s.data[s.top];
	return true;
}

int main(){
	Sqstack stack1;
	InitStack(&stack1);
	if(Stackempty(stack1)){
		printf("当前栈空\n");
	}else{
		printf("当前栈非空\n"); 
	}
	for(int i=1;i<=100;++i){
		Push(&stack1,i);
	}
	if(Stackempty(stack1)){
		printf("当前栈空\n");
	}else{
		printf("当前栈非空\n"); 
	}
	int x;
	if(GetTop(stack1,&x))printf("当前栈顶元素为:%d\n",x);
	printf("出栈并打印15个元素");
	for(int i=0;i<15;++i) 
	if(Pop(&stack1,&x))printf("%d ",x);
	printf("\n");
	if(GetTop(stack1,&x))printf("当前栈顶元素为:%d",x);
	return 0;
}

链栈

一.顺序栈的结构体定义为

typedef struct Lnode{
	ElemType data;
	struct Lnode *next;
}Lnode,*LiStack;

二.初始化一个空栈

void InitStack(LiStack *s){
	(*s)=(Lnode *)malloc(sizeof(Lnode));
	(*s)->next=NULL;
} 

三.判断一个栈是否为空

若栈空则返回true,否则返回false

//判断一个栈是否为空,若栈空则返回true,否则返回false
bool Stackempty(LiStack s){
	if(s->next==NULL)return true;
	return false;
}

四.进栈

//进栈
void Push(LiStack s,ElemType x){
	Lnode* p=(Lnode *)malloc(sizeof(Lnode));
	p->data=x;
	p->next=s->next;
	s->next=p;
}

五.出栈

前提条件:需判断是否栈空

//出栈,需判断是否栈空
bool Pop(LiStack s,ElemType *x){
	if(Stackempty(s))return false;
	*x=s->next->data;
	Lnode *p=s->next;
	s->next=s->next->next;
	free(p); 
	return true;
}

六.读取栈顶元素

前提条件:需判断是否栈空

bool GetTop(LiStack s,ElemType *x){
	if(Stackempty(s))return false;
	*x=s->next->data;
	return 1;
}

链栈实例全部

//栈的基本操作,c语言链栈 
#include<stdio.h> 
#include<malloc.h> 
#define ElemType int  
typedef struct Lnode{
	ElemType data;
	struct Lnode *next;
}Lnode,*LiStack;
//初始化一个空栈
void InitStack(LiStack *s){
	(*s)=(Lnode *)malloc(sizeof(Lnode));
	(*s)->next=NULL;
} 
//判断一个栈是否为空,若栈空则返回true,否则返回false
bool Stackempty(LiStack s){
	if(s->next==NULL)return true;
	return false;
}
//进栈
void Push(LiStack s,ElemType x){
	Lnode* p=(Lnode *)malloc(sizeof(Lnode));
	p->data=x;
	p->next=s->next;
	s->next=p;
}
//出栈,需判断是否栈空
bool Pop(LiStack s,ElemType *x){
	if(Stackempty(s))return false;
	*x=s->next->data;
	Lnode *p=s->next;
	s->next=s->next->next;
	free(p); 
	return true;
}
//读取栈顶元素,前提栈非空
bool GetTop(LiStack s,ElemType *x){
	if(Stackempty(s))return false;
	*x=s->next->data;
	return 1;
}

int main(){
	LiStack stack1;
	InitStack(&stack1);
	if(Stackempty(stack1)){
		printf("当前栈空\n");
	}else{
		printf("当前栈非空\n"); 
	}
	for(int i=1;i<=100;++i){
		Push(stack1,i);
	}
	if(Stackempty(stack1)){
		printf("当前栈空\n");
	}else{
		printf("当前栈非空\n"); 
	}
	int x;
	if(GetTop(stack1,&x))printf("当前栈顶元素为:%d\n",x);
	printf("出栈并打印15个元素");
	for(int i=0;i<15;++i) 
	if(Pop(stack1,&x))printf("%d ",x);
	printf("\n");
	if(GetTop(stack1,&x))printf("当前栈顶元素为:%d",x);
	return 0;
}

总结

顺序栈的入栈操作受数组上界约束,当对栈的最大使用空间估计不足时,难以处理可以采用链栈,链栈通常使用单链表思想,并且所有操作都是在表头进行的,可以设头结点和不设头结点,操作方式有细微区别,具体情况可具体分析

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值