简介:采用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;
}
总结
顺序栈的入栈操作受数组上界约束,当对栈的最大使用空间估计不足时,难以处理可以采用链栈,链栈通常使用单链表思想,并且所有操作都是在表头进行的,可以设头结点和不设头结点,操作方式有细微区别,具体情况可具体分析
本文介绍了使用C语言实现顺序栈和链栈的基本操作,包括初始化、判断栈空、进栈、出栈和读取栈顶元素。顺序栈基于数组,链栈基于单链表,分别给出了详细代码示例。对于顺序栈,提到了其容量限制的问题,而链栈则更灵活。
410





