news 2026/8/9 19:16:58

顺序栈的一些基本运算

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
顺序栈的一些基本运算

0.栈是一种只能在一端进行操作的线性表。

1.创建一个数据类型,里面包含一个数组,和一个栈顶指针,用来记录栈顶的位置。

#define MAXSIXZE 10 typedef struct SeqStack { int data[MAXSIXZE];//最大元素个数是10,也就是最多容量10个整形 int top;//用来记录栈顶 }SeqStack;

2.初始化栈,栈顶指针初始化的时候可以-1或者0,不同的初始值在进行运算所改变的代码不一样

void InitStack(SeqStack* Ps) { Ps->top = -1;//将栈顶元素等于第一个位置的下面 }

3.进栈操作,也就是插入操作(只能在最顶端进行插入),只能在一端进行,初始时top赋值为-1,而数组下标是从0开始的,所以进行插入的时候需要先把top加一,在进行赋值,插入之前需要判断栈是不是满了,十个数据栈顶最大也就是九,数组下标是0~9,等于9的时候应该报错,保证算法的健壮性。(先top++然后再赋值)

int Push(SeqStack* Ps, int elem) { if (Ps->top == MAXSIXZE - 1)//top其实是数组下标,如果等于最大的容量就没有空间可以使用了 return 1; Ps->data[++Ps->top] = elem;//top指向的是当前元素的下标,需要先加一在赋值 return 0; }

4.在进行出栈操作也就是删除操作的时候,首先判断栈是不是空栈。也就是top是不是等于-1,如果是空栈的,不能出栈要报错,保证算法的健壮性,出栈的时候先把删除的元素赋值给临时变量,然后再让top减一,(这个时候只是把top减-并没有把数据删除,下一次赋值的时候会把原来的数据给覆盖掉,达到了逻辑上的删除),先赋值,然后再top-1,顺序不能弄错了

int Pop(SeqStack* Ps) { if (Ps->top == -1)//没有元素能够出栈 { return 1; } int temp = Ps->data[Ps->top];//先赋值,然后再自己减1 Ps->top -= 1; return temp;//把需要删除的数据给返回去 }

5.得到栈顶元素,和出栈不同的是,这个地方只是得到这个元素,不会改变top的值,所以只需要判断栈是不是空栈即可,如果是空栈就报错,保证算法的健壮性,返回top+1可以得到当前顺序表有几个元素

int Gettop(SeqStack* Ps) { if (Ps->top == -1)//说明这个栈是空栈没有空间能够使用 { return -1; } int temp = Ps->data[Ps->top];//top就是栈的下标,top就是最大的元素下标 }

6.顺序栈的建立,使用循环,不能超过最大的数组个数

int FoundStack(SeqStack* Ps) { int i = MAXSIXZE; int elem = 0; scanf("%d", &elem); while (elem != 0 && i--) { Push(Ps, elem); scanf("%d", &elem); } }

7.打印顺序表中的数据,辅助函数

void ShowStack(SeqStack* Ps) { int i = 0; for (i = 0; i <= Ps->top;i++) { printf("%d->", Ps->data[i]); } printf("NULL\n"); }

8.返回top,如果top==-1,说明是空指针

int Empty(SeqStack* Ps) { return Ps->top; }

9。整体代码,栈这个章节相对容易

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #define MAXSIXZE 10 typedef struct SeqStack { int data[MAXSIXZE]; int top; }SeqStack; //void InitStack(SeqStack* Ps) //{ // Ps->top = -1;//将栈顶元素等于第一个位置的下面 //} //void InitStack(SeqStack* Ps) //{ // Ps->top = -1;//将栈顶元素等于第一个位置的下面 // //} void InitStack(SeqStack* Ps) { Ps->top = 0;//将栈顶元素等于第一个位置,将要被插入数据的位置 } //int Push(SeqStack* Ps, int elem)//top=-1的版本 //{ // if (Ps->top == MAXSIXZE - 1)//top其实是数组下标,如果等于最大的容量就没有空间可以使用了 // return 1; // Ps->data[++Ps->top] = elem;//top指向的是当前元素的下标,需要先加一在赋值 // return 0; //} int Push(SeqStack* Ps,int elem) { if (Ps->top == MAXSIXZE)//top指向当前需要被增加元素空间 { return 1; } Ps->data[Ps->top] = elem;//先赋值在加加 Ps->top++; return 0; } //int Pop(SeqStack* Ps)//top=-1的版本 //{ // if (Ps->top == -1)//没有元素能够出栈 // { // return 1; // } // int temp = Ps->data[Ps->top];//先赋值,然后再自己减1 // Ps->top -= 1; // return temp;//把需要删除的数据给返回去 //} int Pop(SeqStack* Ps) { if (Ps->top == 0)//说明没有元素 { return 1; } Ps->top--; int temp = Ps->data[Ps->top]; return 0; } //int Gettop(SeqStack* Ps)//top=-1 //{ // if (Ps->top == -1)//说明这个栈是空栈没有空间能够使用 // { // return -1; // } // int temp = Ps->data[Ps->top];//top就是栈的下标,top就是最大的元素下标 //} int Gettop(SeqStack* Ps) { if (Ps->top == 0)//说明这个栈是空栈没有空间能够使用 { return -1; } int temp = Ps->data[Ps->top];//top就是栈的下标,top就是最大的元素下标 } int FoundStack(SeqStack* Ps) { int i = MAXSIXZE; int elem = 0; scanf("%d", &elem); while (elem != 0 && i--) { Push(Ps, elem); scanf("%d", &elem); } } void ShowStack(SeqStack* Ps) { int i = 0; for (i = 0; i <= Ps->top-1;i++) { printf("%d->", Ps->data[i]); } printf("NULL\n"); } int Empty(SeqStack* Ps) { return Ps->top; } int main() { SeqStack S; InitStack(&S); FoundStack(&S); ShowStack(&S); Pop(&S); ShowStack(&S); return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/9 14:00:14

37、字符串与数字操作详解

字符串与数字操作详解 1. 参数展开基础 参数展开是一项非常实用的技术,它能让我们在脚本编写中更高效地处理变量和字符串。 例如,我们可以使用 ${parameter:?"parameter is empty"} 来检查参数是否为空,如果为空则会报错。 [me@linuxbox ~]$ foo=bar [me@…

作者头像 李华
网站建设 2026/8/9 13:59:00

学习试用codebuddy和Trae编程“俄罗斯方块”测试体验

一、先试用 codeBuddy 代码助手提交游戏制作说明&#xff0c;然后生成基本功能的俄罗斯方块&#xff0c;基本可用&#xff0c;有一些问题&#xff0c;告诉codeBuddy继续优化&#xff0c;基本能用。体验用了几天之后&#xff0c;今天突然提示试用资源用完了。一句话也不给输出了…

作者头像 李华
网站建设 2026/8/9 15:44:34

5分钟搞定RAG实验:LightRAG让学术研究变得如此简单!

5分钟搞定RAG实验&#xff1a;LightRAG让学术研究变得如此简单&#xff01; 【免费下载链接】LightRAG "LightRAG: Simple and Fast Retrieval-Augmented Generation" 项目地址: https://gitcode.com/GitHub_Trending/li/LightRAG 还在为复杂的RAG实验配置而头…

作者头像 李华
网站建设 2026/8/8 12:29:56

关于平抛运动的推导

平抛运动是指物体以一定的初速度沿水平方向抛出&#xff0c;仅受重力作用下的运动。它是一种常见的二维运动形式&#xff0c;结合了水平方向的匀速直线运动和竖直方向的自由落体运动。现在对平抛运动进行推导。分别在 xxx 方向和 yyy 方向上考虑 xxx 方向&#xff1a;由于不考虑…

作者头像 李华
网站建设 2026/8/10 0:18:21

从零开始构建类型安全的Feather图标库

从零开始构建类型安全的Feather图标库 【免费下载链接】feather 项目地址: https://gitcode.com/gh_mirrors/fea/feather 在现代前端开发中&#xff0c;图标作为用户界面的重要组成部分&#xff0c;其质量和易用性直接影响开发效率和用户体验。Feather图标库以其简洁优…

作者头像 李华
网站建设 2026/8/8 4:37:13

AWR1843毫米波雷达Python实时数据处理与可视化实战指南

AWR1843-Read-Data-Python-MMWAVE-SDK-3 项目为开发者提供了一套完整的解决方案&#xff0c;能够通过Python语言实时读取AWR1843毫米波雷达数据并进行可视化展示。无论您是从事智能交通、安防监控还是工业自动化领域&#xff0c;这款工具都能帮助您快速构建雷达应用原型。 【免…

作者头像 李华