线性表------栈

1、基本概念

  • 栈:只允许在一端插入或删除操作的线性表
  • 栈底(buttom):固定的,不允许进行插入和删除操作的另一端
  • 栈顶(top):线性表允许插入和删除的一段
    栈是线性表,只不过受到限制了,只允许在栈顶进行插入和删除操作,所以先入栈的后出栈
    在这里插入图片描述

2、顺序栈

栈是线性表的特例,栈的顺序存储也是线性表顺序存储。栈的顺序存储结构叫做顺序栈,由于栈是受到限制的(只允许在栈顶进行插入和删除),所以顺序栈需要在顺序表是基础上修改点

/*顺序栈的定义
*/
#define MaxSize 50		//定义栈中有多少个元素
typedef int ElemType;
typedef struct {ElemType data[MaxSize];//存放栈中元素int top;		//栈顶指针
}SqStack;

在这里插入图片描述

  • top值不能超过MaxSize
  • 空栈的判断条件top==-1,初始值也是这个值,当没有元素时,top指向buttom后一个元素,满栈的判断条件top==MaxSize-1

2.1 基本操作

2.1.1 判空

/*判断空
*/
bool StackEmpty(SqStack S) {if (S.top == -1)return true;elsereturn false;
}

2.1.2 进栈
栈不满时,栈顶指针先加1,再送值到栈顶元素

/*进栈
*/
bool Push(SqStack& S, ElemType x) {if (S.top == MaxSize - 1)return false;S.data[++S.top] = x;return true;
}

2.1.3 出栈
先判断栈是否为空,不为空,取栈顶元素,top减一

/*出栈
*/
bool Pop(SqStack& S, ElemType& x) {if (S.top == -1)return false;x = S.data[S.top];S.top--;return true;
}

2.1.4 读取栈顶元素
栈顶不为空,取栈顶元素

/*读取栈顶元素
*/
bool GetTop(SqStack S, ElemType& x)
{if (S.top == -1)return false;x = S.data[S.top];return true;
}

3、共享栈

栈底位置相对不变的,可以让两个顺序栈共享一个一维数组,将两个栈的栈底分别设置在共享栈的两端,两个栈顶向共享空间的中间延伸,当一个栈存放数据少,一个栈存放数据多,可以考虑共享栈
在这里插入图片描述

typedef struct {ElemType data[MaxSize];		//存放元素int top1;					//栈1栈顶int top2;					//栈2栈顶
}SqDoubleStack;
  • 初始状态:top1=-1,top2=MaxSize,所以当top1=-1时表示栈1空,top2=MaxSize时,表示栈2空
  • 栈满:当top1和top2相差1时,栈满,此时两个栈的栈顶紧挨着,没有空间存放数据了
  • 出栈:top2加1,top1要减1
  • 入栈:top1加1,top2减1

3.1基本操作

3.1.1 进栈

/*进栈stackNum:栈的序号*/bool Push(SqDoubleStack& S, ElemType x, int stackNum) {if (S.top1 + 1 == S.top2)return false;	//栈满if (stackNum == 1)S.data[++S.top1] = x;if (stackNum == 2)S.data[++S.top2] = x;return true;
}

4、链式栈

采用链式存储的栈称为链栈,链栈的优点是便于多个栈共享存储空间和提高其效率,并且不存在栈满溢出的情况,通常采用单链表实现,并规定所有操作都是在单链表的表头进行的
带头结点:

typedef struct SNode {ElemType data;			//数据域struct SNode* next;	//指针域
} SNode,*SLink;	//链栈的结点
typedef struct LinkStack {SLink top;	//栈顶指针int count;	//链栈结点数
}LinkStack;	//链栈

不带头结点:

typedef struct SNode {ElemType data;			//数据域struct SNode* next;	//指针域
} SNode,*SLink;	

注意不带头结点和带头结点的链栈,在具体实现方面有所不同
在这里插入图片描述

  • 可以将头指针当做栈顶
  • 空栈的判断条件定为top==null

4.1 基本操作

4.1.1 进栈

/*
进栈
*/
bool Push(LinkStack *S, ElemType x) {SLink p = (SLink)malloc(sizeof(SNode));p->data = x;p->next = S->top;S->top = p;S->count++;return true;}

4.1.2 出栈

/*出栈
*/
bool Pop(LinkStack* S, ElemType& x) {if (S->top == NULL)return false;x = S->top->data;SLink p = S->top;S->top = S->top->next;free(p);S->count--;return true;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无线网络覆盖

描述 我们的乐乐同学对于网络可算得上是情有独钟,他有一个计划,那就是用无线网覆盖郑州大学。 现在学校给了他一个机会,因此他要购买很多的无线路由。现在他正在部署某条大道的网络,而学校只允许把他的无线路由器放在路的正中间…

旧计算机 云桌面,该不该利用旧PC机改造成云桌面虚拟化模式呢?

原标题:该不该利用旧PC机改造成云桌面虚拟化模式呢?由于传统PC电脑办公模式有数据安全隐患、维护成本高、占用空间及耗电量高,噪音大,使用寿命低等弊端正在逐步退出办公领域,越来越多的企业选择桌面虚拟化办公模式。那…

nodemailer 附件_如何使用Nodemailer发送带有附件的电子邮件。 Node.js

nodemailer 附件In the previous article, "How to send emails using Nodemailer?", we discussed how to send simple emails using Nodemailer in Node.js? Here, we are going to learn further – How to send emails with attachments using Nodemailer in N…

线性表-----队列

1、基本概念 队列是只允许在一端进行插入,而在另一段进行删除的线性表队头:允许删除的一端队尾:允许插入的一端空队列:没有任何元素的空表 队列是操作受限的线性表,因此不是任何对线性表的操作都可以作为队列的操作…

如何在React JS组件和React JS App中添加CSS样式?

In this tutorial, we will only work with CSS styles. Please ensure you have basic knowledge of HTML, CSS, React JS and Node.Js. 在本教程中,我们将仅使用CSS样式 。 请确保您具有HTML,CSS,React JS和Node.Js的基础知识。 In our re…

用计算机怎么打出狂浪字谱,狂浪歌曲简谱

狂浪歌曲简谱:66671112|2223176|一波一波接踵而来,大风带着我摇摆,22222112|322143-|66671112|梦在燃烧心在澎拜,不用徘徊。大摇大摆漂在人海,222…

C和汇编---while反汇编

环境&#xff1a;VC C程序&#xff1a; #include "stdio.h"int main() {int i1,sum0;while(i<100){sumi;i;}printf("%d\n",sum);return 0; }用while计算1到100的值&#xff0c;功能很简单&#xff0c;让我们看看反汇编 首先在main函数的入口&#xff0…

IPv6技术未来发展趋势

前言 人们对于采用综合技术&#xff0c;将数据、话音和视频等业务“一网打尽”梦想的追求从来都没有停止过。从上世纪80年代的综合业务数字网(ISDN)技术&#xff0c;到90年代的基于异步传输模式(ATM)的宽带ISDN&#xff0c;直到现在的IPMPLS(多协议标记交换)技术等。在这一过程…

栈的应用

1、括号匹配 如果是扫描到左括号&#xff0c;则入栈如果是扫描到右括号&#xff0c;则检查现在的栈顶元素&#xff0c;如果括号匹配&#xff0c;则栈顶元素出栈结束时&#xff0c;如果栈内没有元素&#xff0c;则括号匹配 bool Check(char *str){stack s;InitStack(s);int le…

Silverlight 布局控件

1.1. Canvas 在Canvas 布局中&#xff0c;控件使用Canvas.Top和Canvas.Left来定位内容: View Code 1 <Canvas x:Name"LayoutRoot" Background"White">2 <Button Name"SampleButton"3 Content"Sample Bu…

C和汇编-----for循环

环境&#xff1a;VC for循环有三个表达式&#xff0c;第一个表达式是初始化&#xff0c;在for循环之前执行一次&#xff0c;后面就不执行了&#xff0c;第二个是循环条件&#xff0c;在执行循环体之前求值&#xff0c;如果为真&#xff0c;执行循环体&#xff0c;如果为假&…

韩国的计算机科学家,韩国科学技术院用普通相机为AR/VR复刻真实世界物理对象...

只需一个包含闪光灯的相机/摄像头(映维网 2018年12月10日)为虚拟环境捕捉和复刻逼真的现实世界对象十分复杂&#xff0c;而且耗时。所以&#xff0c;从移动设备和数码相机&#xff0c;你能想象只通过一个包含内置闪光灯的传统相机来简化这个任务吗&#xff1f;一支全球化的计算…

C和汇编混合编程---do while

环境&#xff1a;VC do while 会先执行do里面的循环体&#xff0c;执行完去执行while的条件判断&#xff0c;如果为真&#xff0c;继续执行do里面的循环体&#xff0c;如果为假&#xff0c;则结束循环 C程序&#xff1a; #include "stdio.h" int main() {int i1,su…

林子大了,什么鸟都有----.NET运用String的十八层境界

林子大了&#xff0c;什么鸟都有----.NET运用String的十八层境界 在上一文中&#xff0c;提到了一句相当常见但十分荒谬的代码&#xff1a;Request.QueryString["id"].ToString()。突然涌起一个想法&#xff0c;为什么不总结一下不同层次.Net开发者如何运用string的呢…

计算机机场基础知识,全国机场频率_电脑基础知识_IT计算机_专业资料

全国机场频率_电脑基础知识_IT计算机_专业资料 (13页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;14.9 积分机场频率2009-11-28 15:29:251分类&#xff1a;默认分类I举报I字匕订阅中国主要机场管制…

c和汇编---函数

环境&#xff1a;VC 作用&#xff1a; 函数是完成特定任务的独立程序代码单元 1、创建和使用函数 函数原型&#xff1a;声明函数是什么类型&#xff0c;指明函数的返回值和函数接收的参数类型&#xff0c;函数和变量一样&#xff0c;有多种类型&#xff0c;任何程序在使用函…

python投骰子程序代码_用于双骰子(一个偏向一个法线)仿真的Python程序

python投骰子程序代码Here, we will be simulating the occurrence of the sum of the faces of two dice [i.e. dice(A) - 1, 2, 3, 4, 5 ,6 dice(B) - 1, 2, 3, 4, 4, 4, 5, 6, 6 ,6]. A dice is normal(each has an equal probability of occurrence) and another B dice i…

如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案[上篇]

一、提出问题 在开发一个企业级 应用的时候&#xff0c;尤其在一个涉及到敏感数据的应用&#xff0c;比如财务系统、物流系统&#xff0c;我们往往有这样的需求&#xff1a;对于数据库中每一笔数据的添加、修改和删除&#xff0c;都需要有一个明确的日志&#xff0c;以便我们可…

执行shellcode的几种方式

首先写出汇编成功弹出计算器 #pragma comment(linker,"/section:.data,RWE") //data段可读写#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") //不显示窗口#pragma comment(linker,"/INCREMENTAL:…

cobaltstrike生成一个原生c,然后利用xor加密解密执行

首先cobaltstrike生成一个原生c&#xff0c;我的是&#xff1a; /* length: 797 bytes */ unsigned char buf[] "\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30\x8b\x52\x0c" "\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff\x31\xc0\xac…