首页 > 其他分享 >16.栈

16.栈

时间:2023-06-12 16:47:52浏览次数:26  
标签:SqStack return 16 top 元素 栈顶 base

1.栈的概念

栈(Stack)是一种数据结构,它遵循后进先出(Last-In-First-Out,LIFO)的原则,也就是说,最后进入栈的元素最先被取出。栈是一种线性数据结构,它由多个元素组成,每个元素被称为栈项(stack item),栈顶(top)是指最后一个被压入栈的元素,栈底(bottom)是指第一个被压入栈的元素。

栈的基本操作包括:

push(入栈):将一个元素压入栈顶。
pop(出栈):将栈顶的元素弹出,并返回它。
peek(查看栈顶元素):查看但不弹出栈顶元素。
isEmpty(判断栈是否为空):判断栈是否为空。
size(获取栈的大小):获取栈中元素的个数。

栈可以用于许多场景,例如函数调用、括号匹配、逆波兰表达式求值等。

2.栈的算法实现

栈数据结构的定义

#define MaxSize 128 //预先分配空间,这个数值根据实际需要预估确定
typedef int ElemType;
typedef struct _SqStack 
{
	ElemType* base; //栈底指针
	ElemType* top; //栈顶指针
}SqStack;

栈的初始化

入栈
入栈操作:判断是否栈满,如果栈已满,则入栈失败,否则将元素放入栈顶,栈顶指针向上移动一个空间(top++)。

出栈
出栈操作: 和入栈相反,出栈前要判断是否栈空,如果栈是空的,则出栈失败,否则将栈顶元素暂存给一个变量,栈顶指针向下移动一个空间(top--)。

bool PopStack(SqStack& S, ElemType& e)//删除S的站顶元素,攒存在变量e中
{
	if (S.base == S.top)//空栈
	{
		return false;
	}

	e = *(--S.top);//栈顶指针减1,将栈顶元素赋给e

	return true;
}

获取栈顶元素
取栈顶元素和出栈不同,取栈顶元素只是把栈顶元素复制一份,栈的元素个数不变,而出栈是指栈顶元素取出,栈内不再包含这个元素。

//获取栈顶元素
ElemType GetTop(SqStack& S)//返回S的栈顶元素,栈顶指针不变
{
	if (S.top != S.base)//栈非空
		return *(S.top - 1);//返回栈顶元素的值,栈顶指针不变
	else
		return -1;
}

//更优的版本  可以使用自定义类型
bool GetTop1(SqStack& S, ElemType& e)//返回S的栈顶元素,栈顶指针不变
{
	if (S.top != S.base)//栈非空
	{
		e = *(S.top - 1);//返回栈顶元素的值,栈顶指针不变
		return true;
	}
	else
	{
		return false;
	}
}

判断空栈

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

获取栈顶元素

int GetSize(SqStack& S) {//返回栈中元素个数
	return (S.top - S.base);
}

销毁栈

void DestroyStack(SqStack& S)//销毁栈
{
	if (S.base)
	{
		free(S.base);
		S.base = NULL;
		S.top = NULL;
	}
}

完整代码:

#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h>
#include <iostream>
#include <stdlib.h>
using namespace std;

#define MaxSize 128 //预先分配空间,这个数值根据实际需要预估确定
typedef int ElemType;
typedef struct _SqStack 
{
	ElemType* base; //栈底指针
	ElemType* top; //栈顶指针
}SqStack;

bool InitStack(SqStack& S)//构造一个空栈
{
	S.base = new ElemType[MaxSize];//为顺序栈分配一个最大容量为MaxSize的空间
	if (!S.base)//空间分配失败
		return false;
	S.top = S.base;//top初始化为base
	return true;
}

bool PushStack(SqStack& S, ElemType e)//插入元素e为新的栈顶元素
{
	if ((S.top - S.base) == MaxSize)//栈满
		return false;

	*(S.top++) = e;//元素e压入栈顶,然后栈顶指针加1,等价于*S.top = e; S.top++;

	return true;

}

bool PopStack(SqStack& S, ElemType& e)//删除S的站顶元素,攒存在变量e中
{
	if (S.base == S.top)//空栈
	{
		return false;
	}

	e = *(--S.top);//栈顶指针减1,将栈顶元素赋给e

	return true;
}

//获取栈顶元素
ElemType GetTop(SqStack& S)//返回S的栈顶元素,栈顶指针不变
{
	if (S.top != S.base)//栈非空
		return *(S.top - 1);//返回栈顶元素的值,栈顶指针不变
	else
		return -1;
}

//更优的版本  可以使用自定义类型
bool GetTop1(SqStack& S, ElemType& e)//返回S的栈顶元素,栈顶指针不变
{
	if (S.top != S.base)//栈非空
	{
		e = *(S.top - 1);//返回栈顶元素的值,栈顶指针不变
		return true;
	}
	else
	{
		return false;
	}
}

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

void DestroyStack(SqStack& S)//销毁栈
{
	if (S.base)
	{
		free(S.base);
		S.base = NULL;
		S.top = NULL;
	}
}

int GetSize(SqStack& S) {//返回栈中元素个数
	return (S.top - S.base);
}

int main()
{
	int n, x;
	SqStack S;
	InitStack(S);//初始化一个顺序栈
	cout << "请输入元素个数n:" << endl;
	cin >> n;
	cout << "请依次输入n个元素,依次入栈:" << endl;
	while (n--)
	{
		cin >> x; //输入元素
		PushStack(S, x);
	}

	cout << "元素依次出栈:" << endl;
	while (!IsEmpty(S))//如果栈不空,则依次出栈
	{
		cout << GetTop(S) << "\t";//输出栈顶元素
		PopStack(S, x); //栈顶元素出栈
	}
	cout << endl;

	DestroyStack(S);
	system("pause");
	return EXIT_SUCCESS;
}

参考资料来源:

奇牛学院

标签:SqStack,return,16,top,元素,栈顶,base
From: https://www.cnblogs.com/codemagiciant/p/17475426.html

相关文章

  • API接口调用|1688商品页面APP、PC端原数据采集获取(页面信息采集API)
    获取1688最新热门商品信息为例,需要进行以下操作:1.获取apikey和apisecret首先需要在开放平台申请开发者账号,并创建应用。开发者账号审核通过后,即可获得自己个人专属的ApiKey和ApiSecret,这些参数需要妥善存储,不要泄露。使用ApiKey和ApiSecret参考开放平台文档进行授权。2.调......
  • m基于FPGA的16QAM调制解调通信系统verilog实现,包含testbench,不包含载波同步
    1.算法仿真效果本系统进行了两个平台的开发,分别是: Vivado2019.2 Quartusii18.0+ModelSim-Altera6.6d StarterEdition 其中Vivado2019.2仿真结果如下:  Quartusii18.0+ModelSim-Altera6.6d StarterEdition的测试结果如下: 2.算法涉及理论知识概要   ......
  • ora-01658 无法为表空间 users中的段创建initial区
    ORA-01658错误表示无法在表空间"USERS"中为新段(如表或索引)创建INITIAL区。这种情况通常发生在表空间已经接近或已经达到其最大容量时。解决:添加额外的数据文件或表空间ALTERTABLESPACEusersADDDATAFILE'/oracle/product/10.2.0/oradata/orcl/users02.dbf'SIZE100M ......
  • stm32 DM9162 网络编程实现
     TX_CLK:数据发送时钟线。标称速率为10Mbit/s时为2.5MHz;速率为100Mbit/s时为25MHz。RMII接口没有该线。RX_CLK:数据接收时钟线。标称速率为10Mbit/s时为2.5MHz;速率为100Mbit/s时为25MHz。RMII接口没有该线。TX_EN:数据发送使能。在整个数据发送过程保存有......
  • idea java项目中,中文显示成Unicode(UTF-16编码)的字符,修改为中文显示
    idea选择File选择Setings搜索框搜索fileencodings勾选Transparentnative-to-asciiconversion      ......
  • 考研周记-week16
    准时的周记6.5~6.11记录一下本周的考研进度情况英语本周继续单词的复习,因为最近一直在赶数学的进度,所以将单词放在了晚上回宿舍之后在背,等到线代过完一轮,就恢复正常的英语复习数学数学方面,本周结束了概率论的复习,线性代数也进行了一半,准备下周结束数学一基础阶段的第一轮复......
  • Win7使用最新的node.js(版本18.16.0)
    截至本文的发布时间2023.06.11,前端开发基础工具node.js的最新版本是18.16.0LTS可能有人要问,为什么要研究node.js在Win7系统下的兼容情况呢?你直接用Win10不就行了?如果你可以直接使用Win10,显然你不是这篇文章的推荐阅读对象,因为某些开发环境比较特殊,只能使用Win7而不允许使用Win......
  • 苹果专卖店的16个小秘密 每平方英尺销售额超6000美元
    苹果在世界上有363家专卖店,这些专卖店每年产生180亿美元的年收益,其中纯利润率为26%,也即是每年44亿美元的纯利润。苹果在世界上有4万2千2百名员工,在美国本土有3万名员工。平均每年一名员工为苹果产生42万美元的年销售额,但每年他们拿回家的收入只有2万5千美元,苹果商店和雇员的巨大收......
  • 9.16 泛型接口
    对于泛型接口的子类而言,有2种实现方式demo1在子类中继续进行泛型定义interfaceIMessage<T>{publicStringecho(Tt);}classMessageImpl<S>implementsIMessage<S>{publicStringecho(St){return"[echo]"+t;}}publicclassHello......
  • Xcode 15 beta (15A5160n) - Apple 平台 IDE
    Xcode15beta(15A5160n)-Apple平台IDEIDEforiOS/iPadOS/macOS/watchOS/tvOS/visonOS请访问原文链接:https://sysin.org/blog/apple-xcode-14/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgXcode15使您能够为所有Apple平台开发、测试和分发应用程序。......