#include <iostream>
#include <stdio.h>
#include <stack>
using namespace std;
int const MAXN = 100;
stack<int> result;
stack<char> chr;
/*
* 算法训练 表达式计算
* 首先创建两个栈,一个用来存放括号,另一个用来存放运算数字结果
* 如果遇到数字则压入结果栈中
* 如果是左括号,则直接压入运算符的栈
* 如果是运算符,则比较一下,如果栈顶内的运算符优先级高于或者等于当前运算符的优先级,则弹出两个数字
和一个运算符进行运算,结果再存到结果的栈里,直到栈顶运算符低于当前读入的运算符或者遇到(,则把当前运算符压栈
*如果是’)’,则运算'('和')'之间的公式
*在算式最后加上')'相当于是结束的标志 *
*如果是‘
*/
/*
*函数名:pd()
* 符号优先级判断
* @param a, 符号栈顶符号
* @param b 当前运算符
* @return 栈顶运算符优先级不低于当前运算符返回true,否则返回false
*/
bool pd(char a, char b){
if(a == '*' || a == '/'){
return true;
}
if(b == '*' || b == '/' || a=='('){
return false;
}
return true;
}
/*
*函数名:f()
* 对算式运算
* @param 无
* @return void
*/
void f(){
char fh = chr.top();
chr.pop();
int num2 = result.top();
result.pop();
int num1 = result.top();
result.pop();
switch(fh){
case '+':
result.push(num1+num2);
break;
case '-':
result.push(num1-num2);
break;
case '*':
result.push(num1*num2);
break;
case '/':
result.push(num1/num2);
break;
}
}
int main()
{
char s[MAXN] = {0};
cin>>s;
int len=0;
while(s[len]!='\0'){
len++;
}
int number=0;
for(int i=0;i<len;i++){
//如果是数字直接存入栈中
if('0'<=s[i] && s[i]<='9'){
number = s[i]-'0';
for(i=i+1;i<len;i++){
if('0'<=s[i] && s[i]<='9'){
number = number*10+(s[i]-'0');
}else{
i--;
break;
}
}
result.push(number);
continue;
}
//如果是'('直接入符号栈
if(s[i]=='('){
chr.push(s[i]);
continue;
}
//如果是运算符
if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/'){
if(!chr.empty()){
while(pd(chr.top(),s[i])){
f();
if(chr.empty()){
break;
}
}
}
chr.push(s[i]);
continue;
}
//如果是')'
if(s[i]==')'){
while(chr.top()!='('){
f();
}
chr.pop();
}
}
if(!chr.empty()){
while(chr.top()){
f();
if(chr.empty()){
break;
}
}
}
while(!result.empty()){
cout<<result.top()<<endl;
result.pop();
}
return 0;
}
C++算法训练 表达式计算
最新推荐文章于 2023-03-25 10:14:21 发布