Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >数据结构——顺序栈

数据结构——顺序栈

原创
作者头像
ruochen
修改于 2021-06-28 02:37:13
修改于 2021-06-28 02:37:13
5160
举报

  • 定义:只能在表的一端(栈顶)进行插入和删除运算的线性表
  • 逻辑结构:一对一关系
  • 存储结构 - 顺序栈 - 链栈
  • 运算规则:只能在栈顶运算,且访问结点时依照后进先出(LIFO)或先进后出(FILO)的原则
  • 实现方式 - 入栈 - 出栈 - 读栈顶元素值 - 建栈 - 判断栈空 - 判断栈慢 - 清空栈 - 销毁栈

栈的表示和操作的实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

顺序栈的C++代码实现

代码语言:txt
AI代码解释
复制
#include<iostream>
using namespace std;

#define OVERFLOW -2 
#define OK 1
#define NULL 0
#define ERROR -1

#define MAXSIZE 100  // 最大空间

typedef int SElemType;
typedef int Status;

typedef struct {
	SElemType* base;
	SElemType* top;
	int stacksize;
}SqStack;

// 顺序栈初始化
Status InitStack(SqStack& S) {
	S.base = new SElemType[MAXSIZE];
	if (!S.base) return OVERFLOW;
	S.top = S.base;
	S.stacksize = MAXSIZE;
	return OK;
}

// 判断顺序栈是否为空
bool StackEmpty(SqStack S) {
	if (S.top == S.base) return true;
	else return false;
}

// 判断是否为满栈
bool StackFull(SqStack S) {
	if (S.top - S.base >= S.stacksize) 
		return true;
	else return false;
}

// 顺序栈的长度
int StackLength(SqStack S) {
	return S.top - S.base;
}

// 输出栈顶元素
Status Gettop(SqStack S, SElemType& e) {
	// SElemType* p;
	if (StackEmpty(S))  // 栈空
		return ERROR;
	// p = S.top - 1;
	// e = *p;
	e = *(S.top - 1);
	return OK;
}

// 入栈
Status Push(SqStack& S, SElemType e) {
	if (StackFull(S))  // 满栈 
		return ERROR;
	*S.top++ = e;
	// *S.top = e;
	// S.top ++;
	return OK;
}

// 出栈
Status Pop(SqStack& S, SElemType& e) {
	if (StackEmpty(S))  // 栈空
		return ERROR;
	e = *--S.top;
	// S.top --;
	// e = *S.top;
	return OK;
}

// 清空顺序栈
Status ClearStack(SqStack& S) {
	// S.stacksize = 0;
	if(S.base) S.top = S.base;
	cout << "清空成功!" << endl;
	return OK;
}

// 销毁顺序栈
Status DestroyStack(SqStack& S) {
	if (S.base) {
		delete S.base;
		S.stacksize = 0;
		S.base = S.top = NULL;
	}
	cout << "销毁成功!" << endl;
	return OK;
}

// 输入
void Creat(SqStack& S, int m) {
	int i;
	SElemType x;
	for (i = 1; i < m + 1; i++) {
		cout << "请输入第" << i << "个元素: ";
		cin >> x;
		Push(S, x);
	//	S.stacksize++;
	}
}

// 输出
void OutPut(SqStack S) {
	SElemType* p;
	p = S.base;
	while (p < S.top)
		cout << *p++ << " ";
	cout << endl;
}

int main()
{
	int m;
	SElemType e;
	SqStack S;

	/*---------------测试--------------*/
	InitStack(S);

	cout << "请输入栈的长度: ";
	cin >> m;
	Creat(S, m);
	cout << "栈中元素为: ";
	OutPut(S);

	cout << "顺序栈的长度为: ";
	cout << StackLength(S) << endl;

	// 入栈测试
	cout << "请输入入栈元素: ";
	cin >> e;
	Push(S, e);
	cout << "栈中元素为: ";
	OutPut(S);

	cout << "顺序栈的长度为: ";
	cout << StackLength(S) << endl;

	// 获取栈顶元素测试
	Gettop(S, e);
	cout << "栈顶元素为: " << e <<endl;

	cout << "顺序栈的长度为: ";
	cout << StackLength(S) << endl;

	// 出栈测试
	Pop(S, e);
	cout << "弹出的元素为: " << e << endl;

	cout << "栈中元素为: ";
	OutPut(S);

	cout << "顺序栈的长度为: ";
	cout << StackLength(S) << endl;

	// 清空测试
	ClearStack(S);
	cout << "顺序栈的长度为: ";
	cout << StackLength(S) << endl;

	// 销毁测试
	DestroyStack(S);
	return 0;
}
代码语言:txt
AI代码解释
复制
请输入栈的长度: 3
代码语言:txt
AI代码解释
复制
请输入第1个元素: 1
代码语言:txt
AI代码解释
复制
请输入第2个元素: 2
代码语言:txt
AI代码解释
复制
请输入第3个元素: 3
代码语言:txt
AI代码解释
复制
栈中元素为: 1 2 3
代码语言:txt
AI代码解释
复制
顺序栈的长度为: 3
代码语言:txt
AI代码解释
复制
请输入入栈元素: 7
代码语言:txt
AI代码解释
复制
栈中元素为: 1 2 3 7
代码语言:txt
AI代码解释
复制
顺序栈的长度为: 4
代码语言:txt
AI代码解释
复制
栈顶元素为: 7
代码语言:txt
AI代码解释
复制
顺序栈的长度为: 4
代码语言:txt
AI代码解释
复制
弹出的元素为: 7
代码语言:txt
AI代码解释
复制
栈中元素为: 1 2 3
代码语言:txt
AI代码解释
复制
顺序栈的长度为: 3
代码语言:txt
AI代码解释
复制
清空成功!
代码语言:txt
AI代码解释
复制
顺序栈的长度为: 0
代码语言:txt
AI代码解释
复制
销毁成功!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据结构资料汇编:栈
以上两种定义,本质上是一样的。在第一种定义中,栈 s 的指针 s.base 在对栈进行操作时不变化,因此可以用它指向栈的数据元素。
老齐
2023/03/02
6310
数据结构资料汇编:栈
c++ 链栈
#define MaxSize 100 #define OK 1 #define ERROR 0 /** 栈 * s=(a1,a2,a3,a4,a5) * a1 栈底 * a5 栈顶 * 入栈(压栈)push * 出栈(弹栈)pop * 案例1 - 进制转换,倒取余 * 案例2 - 括号匹配检测 * 案例3 - 表达式求值(算符优先算法:操作数、运算符、界限符) * ADT Stack { * 数据对象:D={ai|ai 属于 ElemSet ,i=1,2,3,4} * //tod
lascyb
2022/01/13
5610
【数据结构(C语言版)系列二】 栈
栈和队列是两种重要的线性结构。从数据结构角度看,栈和队列也是线性表,但它们是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,它们是和线性表大不相同的两类重要的抽象数据类型。
闪电gogogo
2018/10/10
1.6K0
【数据结构(C语言版)系列二】  栈
数据结构学习—栈
栈的定义 限定在表尾作插入、删除操作的线性表,表中允许进行插入、删除操作的一端称为栈顶(Top),表的另一端称为栈底(Bottom)。 顺序栈 用顺序存储结构实现的栈,即利用一组地址连续的存储单元一次存放自栈底到栈顶的数据元素,同时由于栈的操作的特殊性,还必须设一个位置指针top(栈顶指针)来动态的指示栈顶元素在顺序栈中的位置。(通常以top=-1表示空栈) #include <stdio.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define
用户5513909
2023/04/25
2130
数据结构学习—栈
栈的存储结构的实现(C/C++实现)
存档 1 #include "iostream.h" 2 #include <stdlib.h> 3 #define max 20 4 typedef char elemtype; 5 #i
Angel_Kitty
2018/04/09
5970
栈的存储结构的实现(C/C++实现)
找BUG
---- layout: default title: 找BUG category: [技术, C/C++] comments: true --- 找一找BUG 一段代码,实现一个pop,push,和getmin都是O(1)的方法. 最初源代码 伙伴代码如下,代码的地址可以通过这个访问: Ubuntu Pastebin https://paste.ubuntu.com/p/cX2Cq56PYt/ #include <stdio.h> #include <stdlib.h> #include <s
@坤的
2018/06/04
2K0
顺序栈的实现和两栈共享空间
顺序栈的实现和两栈共享空间 一.顺序栈的实现        栈(stack)是限定仅在表尾进行插入或删除操作的线性表。我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),
猿人谷
2018/01/17
2K0
顺序栈的实现和两栈共享空间
顺序栈的基本操作
栈是限定仅在表尾进行插入好删除操作的线性表。 1、顺序栈结构 typedef struct { SElemType data[MAXSIZE]; int top; /* 用于栈顶指针 */ }SqStack; 2、构造一个空栈  / 清空栈 Status InitStack(SqStack *S) { /* S.data=(SElemType *)malloc(MAXSIZE*sizeof(SElemType)); */ S->top=-1
亦小河
2022/11/14
4770
数据结构——栈的详解[通俗易懂]
栈(stack)是限定仅在表尾进行插入或者删除的线性表。对于栈来说,表尾端称为栈顶(top),表头端称为栈低(bottom)。不含元素的空表称为空栈。因为栈限定在表尾进行插入或者删除,所以栈又被称为后进先出的线性表(简称LIFO:Last in, First out.结构)。
全栈程序员站长
2022/07/22
1.7K0
数据结构——栈的详解[通俗易懂]
数据结构实验报告—栈和队列
任务:建立队列和栈来实现元素逆置 1.建立队列 2.建立栈 3.主函数调用队列和栈实现元素逆置
命运之光
2024/03/20
2640
数据结构实验报告—栈和队列
数据结构 第5讲 顺序栈
       小张终于攒钱买了车,可是他家住在胡同的尽头,胡同很窄,只能通过一辆车,而且是死胡同,每天小张都为停车发愁,回家早了停在里面,早上上班就要让所有的人挪车,先让胡同口那辆出去,然后挨着一辆一辆出去,小张才能去上班。没办法,小张下班也不敢早回家了,等天黑了别的车都停进去了,再回去把车停在胡同口,这样早上就可以第一个去上班了。就这样,过起了"起早贪黑"的有车生活。
rainchxy
2018/09/13
5870
数据结构 第5讲 顺序栈
期末复习之数据结构 第3章 栈和队列
五:写出下列程序段的输出结果(栈的元素类型SElem Type为char)。 1.void main( ){ Stack S; Char x,y; InitStack(S); X=’c’;y=’k’; Push(S,x); Push(S,’a’); Push(S,y); Pop(S,x); Push(S,’t’); Push(S,x); Pop(S,x); Push(S,’s’); while(!StackEmpty(S)){ Pop(S,y);printf(y); }; Printf(x); } 答:输出为“stack”。 2.【严题集3.12②】写出下列程序段的输出结果(队列中的元素类型QElem Type为char)。 void main( ){ Queue Q; Init Queue (Q); Char x=’e’; y=’c’; EnQueue (Q,’h’); EnQueue (Q,’r’); EnQueue (Q, y); DeQueue (Q,x); EnQueue (Q,x); DeQueue (Q,x); EnQueue (Q,’a’); while(!QueueEmpty(Q)){ DeQueue (Q,y);printf(y); }; Printf(x); } 答:输出为“char”。 3.【严题集3.13②】简述以下算法的功能(栈和队列的元素类型均为int)。 void algo3(Queue &Q){ Stack S; int d; InitStack(S); while(!QueueEmpty(Q)){ DeQueue (Q,d); Push(S,d); }; while(!StackEmpty(S)){ Pop(S,d); EnQueue (Q,d); } } 答:该算法的功能是:利用堆栈做辅助,将队列中的数据元素进行逆置。
henu_Newxc03
2021/12/28
8490
期末复习之数据结构 第3章 栈和队列
(重点)链式栈
顺序栈的实现在于使用了数组这个基本数据结构,数组中的元素在内存中的存储位置是连续的,且编译器要求我们在编译期就要确定数组的大小,这样对内存的使用效率并不高,一来无法避免因数组空间用完而引起的溢出问题,二在系统将内存分配给数组后,则这些内存对于其他任务就不可用。而对于链式栈而言,使用了链表来实现栈,链表中的元素存储在不连续的地址,由于是动态申请内存,所以我们可以以非常小的内存空间,另外当某个项目不使用时也可将内存返还给系统。顺序栈是用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据
猿人谷
2018/01/17
1K0
(重点)链式栈
栈(顺序栈)
栈是限制插入和删除只能在一个位置上进行的线性表。其中,允许插入和删除的一端位于表的末端,叫做栈顶(top),不允许插入和删除的另一端叫做栈底(bottom)。对栈的基本操作有 PUSH(压栈)和 POP (出栈),前者相当于表的插入操作(向栈顶插入一个元素),后者则是删除操作(删除一个栈顶元素)。栈是一种后进先出(LIFO)的数据结构,最先被删除的是最近压栈的元素。栈就像是一个箱子,往里面放入一个小盒子就相当于压栈操作,往里面取出一个小盒子就是出栈操作,取盒子的时候,最后放进去的盒子会最先被取出来,最先放进去的盒子会最后被取出来,这即是后入先出。下面是一个栈的示意图:
后端码匠
2020/12/09
1.1K0
栈(顺序栈)
数据结构-栈
该文介绍了数据结构中的栈和链式栈,包括它们的定义、性质、操作和实现。
chaibubble
2018/01/02
8220
数据结构-栈
数据结构 栈&队列
2-4 依次在初始为空的队列中插入元素a,b,c,d以后,紧接着做了两次删除操作,此时的队头元素是( ) 删除,移动头指针; 增加,移动尾指针; 删除a,b ,队头c 2-3 在一个链队列中,front和rear分别为头指针和尾指针,则插入一个结点s的操作为( ) 这道题目,我坚持自己的答案,就是这个答案! 2-1 若用大小为6的数组来实现循环队列,且当前front和rear的值分别为0和4。当从队列中删除两个元素,再加入两个元素后,front和rear的值分别为多少?  删除,front+
Kindear
2018/01/15
3.5K0
数据结构 栈&队列
栈的基本实现(更新中)
参考着严蔚敏的《数据结构(C语言版)》,用自己拿渣的可怜的C语言做了一下午的实现。。。也没能写出来几个。。。就很菜(气哭)。。。
李志伟
2019/12/17
6950
C++栈的基本操作及原理和STL函数
第二种 status(这个表示函数状态 ,类型根据定义 ,如:typedef int Status 或 typedef char Stau)
莫浅子
2022/11/18
5530
C++栈的基本操作及原理和STL函数
数据结构 ----- 栈(代码)
#include <stdio.h> #include <stdlib.h> #include <time.h> #define ERROR 0 #define OK 1 #define STACKSIZE 10; //存储空间分配增量 #define STACK_INIT_SIZE 100; //存储空间初始分配量 typedef int ElemType; typedef int Status; typedef struct { ElemType* base;
meihuasheng
2021/03/18
3980
链表实现栈的动态顺序存储实现—C语言
头文件 ElemType.h /*** *ElemType.h - ElemType的定义 * ****/ #ifndef ELEMTYPE_H #define ELEMTYPE_H typedef int ElemType; int compare(ElemType x, ElemType y); void visit(ElemType e); #endif /* ELEMTYPE_H */  DynaSeqStack.h /*** *DynaSeqStack.h - 动态顺序栈的定义 * **
WindCoder
2018/09/20
1.2K0
相关推荐
数据结构资料汇编:栈
更多 >
领券
社区新版编辑器体验调研
诚挚邀请您参与本次调研,分享您的真实使用感受与建议。您的反馈至关重要,感谢您的支持与参与!
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
首页
学习
活动
专区
圈层
工具
MCP广场
首页
学习
活动
专区
圈层
工具
MCP广场