栈的特点
1. 一种线性存储结构,先进后出。
2.限定只能在栈顶进行插入和删除操作。
s.empty(); //如果栈为空则返回true, 否则返回false;
s.size(); //返回栈中元素的个数
s.top(); //返回栈顶元素, 但不删除该元素
s.pop(); //弹出栈顶元素, 但不返回其值
s.push(); //将元素压入栈顶
【分析】
1.考虑表达式中数的先后顺序,具体可用树状图来表示。
2.运用栈相关的操作完成加减乘除运算
【代码】
#include <bits/stdc++.h>
using namespace std;
string a;
int main(){
stack<long long> s;//记得开long long
getline(cin,a);
int l=a.size();
int i=0;//赋初值
long long m,n;
while(a[i]!='@'){
switch(a[i]){
case '+':n=s.top();s.pop();m=s.top();s.pop();s.push(m+n);break;
case '-':n=s.top();s.pop();m=s.top();s.pop();s.push(m-n);break;
case '*':n=s.top();s.pop();m=s.top();s.pop();s.push(m*n);break;
case '/':n=s.top();s.pop();m=s.top();s.pop();s.push(m/n);break;//运算
default:
long long t=0,flag=0;
while(a[i]>='0' && a[i]<='9'){
t=t*10+a[i]-'0';
i++;
flag=1;
}
if(flag) s.push(t);//如果是数字 入栈
break;
}
i++;//下一位
}
cout<<s.top() ;
return 0;
}
【分析】
先考虑将左括号放入栈中(可以直接用别的数代替),再用右括号进行配对。不能先使右括号入栈,那样的运算是非法的。当栈不为空时,每一个右括号