周六900C++班级-20230211-栈
栈定义:
栈是一种自下而上的数据结构类型,遵循元素先进后出或后进先出的特点,可以通过数组模拟也可以通过头文件<stack>来导入
数组模拟的栈定义:
int stack[1001]; //长度1001的栈 int top = -1; //栈顶指针
<stack>头文件的栈定义:
#include<stack> stack<int> q; //定义了整型栈q
以下是栈常见的五个操作:空栈empty,入栈push,出栈pop,栈顶top,清空clear
空栈empty:判断一个栈是否为空
数组模拟:
if(top==-1) //空栈 if(top!=-1) //非空
<stack>头文件:
if(q.empty()) //条件为真是空栈 if(!q.empty()) //条件为真是非空
入栈push:将元素x加入到栈中
数组模拟:
stack[++top] = x;//先对top++,然后将元素x放入栈stack中的下标top位置
<stack>头文件:
stack<int> q; q.push(x);
出栈pop:将栈顶元素出栈
数组模拟:
if(top!=-1) //如果栈不为空 top--;//栈顶下标-1即为栈顶元素出栈
<stack>头文件:
if(!q.empty()) //如果栈非空 q.pop()
栈顶top:
数组模拟:
if(top!=-1) stack[top];
<stack>头文件:
if(!q.empty()) q.top()
清空clear:将栈清空
数组模拟:
top = -1
<stack>头文件:
while(!q.empty()) //当栈非空时 q.pop() //栈顶不断出栈
____________________________________________________________
TZOJ:1218: 数据结构练习题――栈
描述
请你定义一个栈,可以对栈进行“压入堆栈”、“弹出栈顶元素”、“清空堆栈”、“获取栈顶元素”等操作。键盘输入一些命令,可以执行上述操作。本题中,栈元素均为整数。栈的最大元素个数为1000。
输入
输入各个命令,它们对应的格式如下:
压入堆栈:push a,a代表压入堆栈的元素,这里push和元素之间用空格分隔。
清空堆栈:clear
获取栈顶元素:top
弹出栈顶元素:pop
当输入的命令为exit时,程序结束。
输出
当输入的命令为pop时,请输出弹出的元素值。
当输入的命令是top时,请输出当前栈顶元素值。
注意,如果没有满足的元素,请输出None。
样例输入
push 1
top
clear
push 2
pop
exit
样例输出
1
2
#include<bits/stdc++.h> using namespace std; int a[1020]; string b; int top; int main(){ while(cin>>b){ if(b=="exit")break; if(b=="push"&&top<1000){ int c; cin>>c; a[++top]=c; } if(b=="pop"){ if(top>0)cout<<a[top--]<<endl; else cout<<"None"<<endl; } if(b=="top"){ if(top>0)cout<<a[top]<<endl; else cout<<"None"<<endl; } if(b=="clear")top=0; } return 0; }
7676: 括弧匹配检验
描述
假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([]())或[([][])]等为正确的匹配,[(])或([]()或(()))均为错误的匹配。
现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?
输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出 “OK” ,不匹配就输出“Wrong”。
输入
输入仅一行字符(字符个数小于255)。
输出
匹配就输出 “OK” ,不匹配就输出“Wrong”。
样例输入
[(])
样例输出
Wrong
#include<bits/stdc++.h> using namespace std; int find(char a[]) { char s[305]; int top = -1; for(int i=0;i<strlen(a);i++) { if(a[i]=='(' || a[i]=='[' || a[i]=='{') s[++top] = a[i]; else if(a[i]==')' && s[top]!='(')return 0; else if(a[i]==']' && s[top]!='[')return 0; else if(a[i]=='}' && s[top]!='{')return 0; else top--; } if(top!=-1)return 0; else return 1; } int main() { char a[300]; cin>>a; if(find(a))cout<<"OK"; else cout<<"Wrong"; return 0; }
4873: 表达式求值
描述
给定一个只包含加法和乘的算术表达式,请你编程计算表达式的值。
输入
输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“ +”和乘法运算符“ *”,且没有括号,所有参与运算的数字均为0到2^31 -1之间的整数。输入数据保证这一行只有 0~ 9、+、* 这 12 种字符。
数据范围
对于 30% 的数据,0≤表达式中加法运算符和乘法运算符的总数≤100;
对于 80% 的数据,0≤表达式中加法运算符和乘法运算符的总数≤1000;
对于 100% 的数据,0≤表达式中加法运算符和乘法运算符的总数≤100000。
输出
输出只有一行,包含一个整数,表示这个表达式的值。注意:当答案长度多于4位时,请只输出最后4位,前导0不输出。
样例输入
1+1*3+4
样例输出
8
#include<bits/stdc++.h> using namespace std; int cal(int a,int b,char op) { switch(op) { case '+':return a+b%10000;break; case '*':return a*b%10000;break; } } int find(string k) { int num = 0; for(int i=0;i<k.length();i++) { num = num*10+(k[i]-'0'); } return num; } int main() { int a,b; char c; stack<char> s; stack<int> q; cin>>a; q.push(a%10000); while(c=getchar(),c!='\n') { cin>>a; //cout<<c<<a<<endl; q.push(a); if(c=='*') { int x = q.top();q.pop(); int y = q.top();q.pop(); q.push(x*y%10000); } } int sum = 0; while(!q.empty()) { int x = q.top();q.pop(); //cout<<x<<endl; sum+=x; sum%=10000; } cout<<sum; return 0; }