顺序栈和链栈的定义和使用C语言实现(附有完整代码)
创始人
2024-01-13 03:31:21

栈的基本内容:

无论是我们接下来要讲的栈还是后面要讲到的队列,他们虽然在名字上不同于我们之前的顺序表或者单链表,但是它们本质也是线性表,只是在基本操作上没有表那么“自由”。比如:栈只能从栈顶进行插入和删除,而队列只能从对头进行删除,队尾进行插入。

举例:

叠放在一起的盘子,当想要加入新的盘子时,只能在底部或者尾部加入,删除同样也是。
在这里插入图片描述空栈:
在这里插入图片描述
栈顶和栈底:

在这里插入图片描述

顺序栈:

既然上文都说到“栈”和“队列”都是一种“特殊的”线性表”,那么顺序栈,顾名思义就是按照顺序存储的栈。

定义:

既然是顺序存储的,那么我们依然可以和顺序表相类似,采用数组去存放!

typedef struct {int data[size];int top;//栈顶指针
}seqstack;//seqstack为结构体类型

入栈操作:

对于顺序表的插入操作,我们在栈中叫做“入栈”由于栈的特殊性,只能在栈顶进行操作。

需要提醒的是:一定是栈顶指针先进行移动,再将新插入的元素赋给栈顶空间。也就是说S.top = S.top + 1;S.data[S.top] = x;的顺序不能发生颠倒。

void Pushstack(seqstack& S)
{if (S.top == size)printf("栈满,拒绝元素继续入栈!");else {printf("请依次输入你要入栈的元素:\n");int x,i;for (i = 0; i < size; i++) {scanf("%d", &x);S.top = S.top + 1;S.data[S.top] = x;printf("入栈成功!\n");}}
}

举例:
在这里插入图片描述

出栈:

虽然是“出栈”,但是如果后续没有入栈操作对出栈位置进行数据覆盖的话,其实出栈并不是真正意义上的“消失”,只是在逻辑上上被删除了,其实给出下标地址,依然可以找到该元素。**return S.data[S.top];**就是将该元素的值返回,以便下次能够快速找到。

int  PopStack(seqstack& S) {if (S.top == -1) {printf("栈为空,没有元素输出!");}{printf("当前栈顶元素为:");return S.data[S.top];S.top = S.top - 1;}
}

关于顺序栈的其他操作都是比较简单的,这里就不一一进行讲解了,需要注意的事项我会在下面的完整代码中注释出来!

顺序栈的缺点:

栈的大小不可发生变化。

出栈顺序的计算方法:

在这里插入图片描述如上图所示:

进栈顺序为a->b->c->d->e,则对应的出栈顺序为e->d->c->b->a

但有时候出栈和进栈是穿插进行的:

举例:
在这里插入图片描述
这种进栈出栈穿插的方式有很多种。

由此,我们可以得出一个结论:

在这里插入图片描述

链栈:

既然上文都说到“栈”和“队列”都是一种“特殊的”线性表”,那么链栈,顾名思义就是按照链式存储的栈。

基本实现方法和单链表相同,这里就不一一进行讲解了,需要注意的事项我会在下面的完整代码中注释出来!

链栈完整代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#define size 5
typedef struct LinkNode {int data;struct LinkNode* next;
}Linkstack;//初始化
void Iniststack(Linkstack *L) {L= (LinkNode*)malloc(sizeof(LinkNode));if (!L->data) {printf("申请失败");}else{L->data = 0;L->next = NULL;}
}
//入栈
void Pushstack(Linkstack *L) {int e,x;printf("请输入你要创建的链栈长度:");scanf("%d", &x);printf("请输入你要入栈的元素:\n");for (int i = 0; i < x; i++) {LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));scanf("%d", &e);s->data = e;s->next = L->next;L->next = s;}	
}
//出栈
int  Popstack(Linkstack* L)
{LinkNode* s= L->next;s->data = L->data;L->next = s->next;return s->data;
}
//读取栈顶元素
int  Getstack(Linkstack* L) {if (!L->data){printf("栈为空!");}else {int e = L->next->data;return e;}
}
//输出栈中元素
void Printsatck(Linkstack* L) {if (!L->data){printf("栈为空!");}else {LinkNode* p;p = L;printf("栈中元素如下:");while (p){p = p->next;printf("%d", p->data);}}
}
int main() {Linkstack L;Iniststack(&L);Pushstack(&L);Popstack(&L);Getstack(&L);Printsatck(&L);
}

输出:
在这里插入图片描述

顺序栈完整代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#define size 5
typedef struct {int data[size];int top;
}seqstack;
//初始化操作
void InistStack(seqstack &S) {S.top = -1;
}
//判空操作
void IsEmpty(seqstack& S)
{if (S.top == -1)printf("目前栈为空!\n");
}
//入栈操作
void Pushstack(seqstack& S)
{if (S.top == size)printf("栈满,拒绝元素继续入栈!");else {printf("请依次输入你要入栈的元素:\n");int x,i;for (i = 0; i < size; i++) {scanf("%d", &x);S.top = S.top + 1;S.data[S.top] = x;printf("入栈成功!\n");}}
}
//读取栈顶元素
void Getstack(seqstack& S) {if (S.top == -1) {printf("栈为空,没有元素输出!");}{printf("当前栈顶元素为:");printf("%d\n", S.data[S.top]);}
}
//输出栈中元素
void Printstack(seqstack& S) {if (S.top == -1) {printf("栈为空,没有元素输出!");}else {printf("栈中元素如下:");for (int i = 0; i < size; i++) {printf("%d", S.data[i]);}printf("\n");}
}
//出栈
int  PopStack(seqstack& S) {if (S.top == -1) {printf("栈为空,没有元素输出!");}{printf("当前栈顶元素为:");return S.data[S.top];S.top = S.top - 1;}
}
//删除栈顶元素int Deletestack(seqstack& S) {if (S.top == -1) {printf("栈为空!\n");}else{int e;for (int i = 0; i < size; i++) {e = S.data[S.top];S.top = S.top - 1;return e;}printf("所有元素已被删除!\n");}
}
//清栈
void Clearstack(seqstack& S) {S.top = -1;printf("栈已经被清空!\n");
}
int main() {seqstack S;int x;InistStack(S);IsEmpty(S);Pushstack(S);Getstack(S);Printstack(S);/*x=PopStack(S);*/Deletestack(S);Clearstack(S);Printstack(S);
}

输出:

在这里插入图片描述

相关内容

热门资讯

demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...