首页 > 编程语言 >栈(Stack)的基本原理及算法实现

栈(Stack)的基本原理及算法实现

时间:2023-08-14 21:47:01浏览次数:41  
标签:基本原理 栈顶 pop 链表 算法 push 操作 Stack 指针

栈(Stack)的基本原理及算法实现

一、栈的基本概念

栈(Stack)是一种后进先出(LIFO,Last In First Out)的线性表,其特点是只允许在一端进行插入操作,而在另一端进行删除操作。栈的基本操作有:入栈(push)、出栈(pop)、查看栈顶元素(top)等。

二、栈的实现原理

  1. 数组实现:使用一组连续的内存空间来存储栈中的元素,栈顶指针指向栈顶元素的下一个位置。入栈时,将新元素存储在栈顶指针的下一个位置;出栈时,将栈顶元素移动到栈顶指针的位置,并释放该空间。

  2. 链表实现:使用一组节点来存储栈中的元素,每个节点包含一个数据域和一个指向下一个节点的指针。入栈时,将新元素添加到链表尾部;出栈时,将栈顶元素从链表中移除,并更新栈顶指针。

  3. 递归实现:利用递归的方式实现栈的操作,如pushpop。这种实现方式较为简洁,但效率较低。

下面分别介绍数组实现和链表实现的栈算法流程。

1. 数组实现

算法步骤:

  1. 初始化一个空栈。
  2. push操作:将新元素存储在栈顶指针的下一个位置,然后更新栈顶指针。
  3. pop操作:将栈顶元素移动到栈顶指针的位置,并释放该空间,然后更新栈顶指针。
  4. top操作:返回栈顶元素的值。

C++代码实现:

#include<bits/stdc++.h>  // 引入常用的头文件
#define reg register  // 定义寄存器宏
#define ull unsigned long long  // 定义无符号长整型别名
using namespace std;  // 使用标准命名空间

// 读取输入的函数,返回值为整数类型
inline int read(){
	int x=0,f=1;  // 初始化变量x和f
	char ch=getchar();  // 读取一个字符
	while(ch<'0'||ch>'9'){  // 如果字符不是数字,则继续读取
		if(ch=='-')	f=-1;  // 如果字符是负号,则将f设为-1
		ch=getchar();  // 读取下一个字符
	}
	while(ch>='0'&&ch<='9'){  // 如果字符是数字,则将其转换为整数并累加到x中
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();  // 读取下一个字符
	}
	return x*f;  // 返回结果,如果f为-1,则返回负数
}

// 输出结果的函数,参数为整数类型
void write(int x){
	if(x<0){  // 如果x小于0,则输出负号
		putchar('-');
		x=-x;  // 取绝对值
	}
	if(x>9)	write(x/10);  // 如果x大于9,则递归调用write函数,将x除以10的结果作为参数传入
	putchar(x%10+'0');  // 输出x除以10的余数,并将其转换为字符类型
	return ;
}

int t;  // 定义整数变量t,用于存储测试用例的数量
vector<ull > a;  // 定义一个无符号长整型向量a,用于存储数据

int main(){
	t=read();  // 读取测试用例的数量
	while(t--){  // 循环处理每个测试用例
		int n=read();  // 读取操作次数n
		a.clear();  // 清空向量a
		while(n--){  // 循环执行n次操作
			string s;  // 定义一个字符串变量s,用于存储操作指令
			cin>>s;  // 读取操作指令
			if(s=="push"){  // 如果指令是"push",则执行以下操作
				ull x;  // 定义一个无符号长整型变量x
				cin>>x;  // 读取要压入向量a的元素
				a.push_back(x);  // 将元素x压入向量a的末尾
				continue;
			}
			if(s=="pop"){  // 如果指令是"pop",则执行以下操作
				if(a.empty()){  // 如果向量a为空,则输出"Empty"并跳过本次循环
					printf("Empty\n");
					continue;
				}
				a.pop_back();  // 否则,弹出向量a的最后一个元素
				continue;
			}
			if(s=="query"){  // 如果指令是"query",则执行以下操作
				if(a.empty()){  // 如果向量a为空,则输出"Anguei!"并跳过本次循环
					printf("Anguei!\n");
					continue;
				}
				cout<<a.back()<<endl;  // 否则,输出向量a的最后一个元素
				continue;
			}
			if(s=="size"){  // 如果指令是"size",则执行以下操作
				cout<<a.size()<<endl;  // 输出向量a的大小
			}
		}
	}
	return 0;  // 程序正常结束,返回0
}

2. 链表实现

算法步骤:

  1. 初始化一个空链表。
  2. push操作:将新元素添加到链表尾部。
  3. pop操作:遍历链表,找到第一个等于栈顶元素的节点并将其移除。同时更新链表头和栈顶指针。如果链表为空,则表示栈为空。

标签:基本原理,栈顶,pop,链表,算法,push,操作,Stack,指针
From: https://www.cnblogs.com/Nebulary/p/17629833.html

相关文章

  • 有向图的Tarjian算法
    强连通分量对于一张有向图,对于图中任意两个节点\(x,y\),\(x\)能到\(y\),\(y\)也能到\(x\),则称其为强连通图。有向图的极大联通子图被称为强连通分量,简记为SCC(StronglyConnectedComponent)。有时候,我们需要将一张有向图分成几个强连通分量,这时候可以基于Tarjian设计一个算法。T......
  • 算法镇魂三部曲!
    一只小狐狸带你解锁炼丹术&NLP秘籍震惊!乐坛新人夕小瑶的卖萌屋今日重磅发布三张原创专辑!!????点击试听????点击试听????点击试听虽然卖萌屋常常被大家戏称为“仙女屋”、“神仙屋”、“宝藏屋”等,但卖萌屋更希望自己能成为一个有温度的创作小屋  小屋的每一位创作者,都跟小夕一样喜......
  • 2023-08-14:用go语言写算法。给出两个长度相同的字符串 str1 和 str2 请你帮忙判断字符
    2023-08-14:用go语言写算法。给出两个长度相同的字符串str1和str2,请你帮忙判断字符串str1能不能在零次或多次转化后变成字符串str2,每一次转化时,你可以将str1中出现的所有相同字母变成其他任何小写英文字母,只有在字符串str1能够通过上述方式顺利转化为字符串......
  • 2023-08-14:用go语言写算法。给出两个长度相同的字符串 str1 和 str2 请你帮忙判断字符
    2023-08-14:用go语言写算法。给出两个长度相同的字符串str1和str2,请你帮忙判断字符串str1能不能在零次或多次转化后变成字符串str2,每一次转化时,你可以将str1中出现的所有相同字母变成其他任何小写英文字母,只有在字符串str1能够通过上述方式顺利转化为字符串str2......
  • 敏感词过滤算法实现(前缀树)
    前缀树前缀树是N叉树的一种特殊形式,也叫Trie、字典树、查找树。通常来说,一个前缀树是用来存储字符串的。前缀树的每一个节点代表一个字符串(前缀)。每一个节点会有多个子节点,通往不同子节点的路径上有着不同的字符。子节点代表的字符串是由节点本身的原始字符串,以及通往该子节......
  • 类欧几里得算法
    类欧几里得算法定义\[\displaystyle\begin{aligned}f(a,b,c,n)&=\sum\limits_{i=0}^{n}\left\lfloor\dfrac{ai+b}{c}\right\rfloor\\g(a,b,c,n)&=\sum\limits_{i=0}^{n}{\left\lfloor\dfrac{ai+b}{c}\right\rfloor}^2\\h(a,b,c,n)&......
  • Nginx 基本原理与最小配置
    文章和代码已经归档至【Github仓库:<https://github.com/timerring/front-end-tutorial>】或者公众号【AIShareLab】回复nginx也可获取。目录结构进入Nginx的主目录有如下文件夹client_body_tempconffastcgi_temphtmllogsproxy_tempsbinscgi_tempuwsgi_temp其中以_temp结......
  • 编程题算法总结
    求最大公约数最小公倍数最大公约数辗转相除法大的a除小的b,得到余数如果是0,那么b就是最大公约数,否则就取余数做那个小的,本来的b就成了大的继续操作。intn,m;//辗转相除法,ab最大公约数=ab余数和b的最大公约数intyu,a,b;a=n>m?n:m;b=n>m?m:n......
  • 位运算 学习笔记【C++ 算法竞赛】
    大家好,欢迎来到我的第一篇博客位运算和移位运算作为计算机的基本运算之⼀,其都是对⼆进制位进⾏操作。作为近年算法竞赛笔试较热门的考点,它能够快捷地完成特定的应用。掌握它是⾮常有必要的。以下是目录:目录1.位运算的优先级2.左移运算<<、右移运算>>2.1运算规则:2.2应用:......
  • 路径规划算法:基于人工蜂鸟优化的机器人路径规划算法- 附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......