栈是一种线性数据结构,栈的特征是数据的插入和删除只能通过一端来实现,这一端称为“栈顶”,相应的另一端称为“栈底”。
用一个简单的例子来说,栈就像一个放乒乓球的圆筒,底部是封住的,如果你想拿出乒乓球,只能从顶部拿。同样的,如果你想再将乒乓球放回去,也只能从顶部放入其中。当然生活中还有很多这样的例子,再比如食堂中的一叠盘子,我们只能从顶端一个一个的取。放盘子也只能放在最上方。
总结栈的特点为:先入后出(Last In First Out->LIFO),即先入栈的元素要在之后入栈的元素取出来之后才能取出来。
对于栈的使用,我们可以直接利用STL模板来实现,STL模板库中栈的基本操作如下:
头文件:#include<堆栈>
创建一个存放int类型数据的空栈s:stack
s.empty(): 判断栈是否为空,为空返回true,否则返回false;
s.size(): 返回栈中元素的个数;
s.top(): 获取栈顶元素的值;
s.push(k): 向栈中添加新的元素k;
s.pop(): 删除栈s的栈顶元素。
s.push(k): 向栈中添加新的元素k;
s.pop(): 删除栈s的栈顶元素。
逆波兰表达式,又称后缀表达式,后缀表达式不包含括号,运算符(包括'+''-''*''/')放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *。利用栈结构,将后缀表达式的结果计算出。
【输入描述】输入一个逆波兰表达式,字符之间用空格隔开
【输出描述】输出算式结果
【输入样例】2 1 + 3 *
【输出样例】9
- #include
- #include
- using namespace std;
- int main(){
- int t,k;
- char c;
- stack<int> s;
- while(cin>>c){
- if(c>='0'&&c<='9')
- s.push(c-'0'); //是数字就入栈
- if(c=='+'){
- t=s.top(); //获取栈顶数字
- s.pop(); //出栈
- k=s.top(); //获取新的栈顶
- s.pop(); //出栈
- s.push(t+k); //相加的和入栈
- }
- if(c=='-'){
- t=s.top(); //获取栈顶
- s.pop(); //出栈
- k=s.top(); //获取新的栈顶
- s.pop(); //出栈
- s.push(k-t); //相减结果入栈,注意顺序
- }
- if(c=='*'){
- t=s.top();
- s.pop();
- k=s.top();
- s.pop();
- s.push(t*k); //相乘的积入栈
- }
- if(c=='/'){
- t=s.top();
- s.pop();
- k=s.top();
- s.pop();
- s.push(k/t); //相除结果入栈注意顺序
- }
- }
- cout<
top(); - return 0;
- }
给定一个字符串,里边可能包含“()”、“[]”、“{}”三种括号,请编写程序检查该字符串的括号是否匹配出现,匹配说明嵌套关系正确,例如 {[()]}() 是匹配的,而)({)[}]( 则不匹配。匹配则输出YES,否则输出NO。)
【输入描述】输入一个字符串 例如(1+2)/(0.5+1)
【输出描述】如果字符串匹配则输出YES,否则输出NO
【输入样例】(1+2)/[(0.5+1)*2]
【输出样例】YES
- #include
- #include
- using namespace std;
- int main(){
- stack<char> s;
- string a;
- cin>>a;
- for(int i=0;i
size();i++){ - if(a[i]=='('||a[i]=='['||a[i]=='{') s.push(a[i]); //左括号入栈
- if(a[i]==')'){
- if(s.empty()) //右括号没匹配的就no
- {
- cout<<"NO"<
- return 0;
- }
- if(s.top()=='(')s.pop(); //右括号有匹配的则出栈
- }
- if(a[i]==']'){
- if(s.empty()) //右括号没匹配的就no
- {
- cout<<"NO"<
- return 0;
- }
- if(s.top()=='[') s.pop(); //右括号有匹配的则出栈
- }
- if(a[i]=='}'){
- if(s.empty()) //右括号没匹配的就no
- {
- cout<<"NO"<
- return 0;
- }
- if(s.top()=='{') s.pop(); //右括号有匹配的则出栈
- }
- }
- if(s.empty()) cout<<"YES"<
- else cout<<"NO"<
- return 0;
- }
-
相关阅读:
Java_只出现一次的数字
React 中 useState 清理的必须性
2024最新SSL证书在线申请系统源码 | 支持API接口 支持在线付费 二开优化版
大数据Flink(六十七):SQL & Table 简介及运行环境
Python学习记录 函数基础
ElasticSearch(七):ES查询速度为什么那么快
Linux高性能服务器编程 学习笔记 第七章 Linux服务器程序规范
第2-2-4章 常见组件与中台化-常用组件服务介绍-分布式ID-附Snowflake雪花算法的代码实现
本地FTP服务器快速搭建(windows)
【1++的刷题系列】之双指针
-
原文地址:https://blog.csdn.net/qq_39434533/article/details/139632667
-
最新文章
-
沪漂五周年了:我越来越迷茫了
Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
MySQL-Seconds_behind_master的精度误差
[MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
Agent OS :五种驯服不确定性的范式
PortSwigger SQL注入LAB11
数据库即时编译JIT
[Begin]AI Learn Data Day 0
深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU