这是C++刷题的Day2
🕋题目描述
🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀
小科在你的帮助下,破解了第一道密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”,“)”,“0-9”,“+”,“-”,“*”,“/”,“^”,求出的值就是密码。小科数学学得不好,还需你帮他的忙。(“/”用整数除法)
输入格式
共1行,为一个算式。
输出格式
共1行,就是密码。
输入输出样列
输入样例1:
1+(3+2)(7^2+69)/(2)
输出样例1:
258
🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀
🔑题目描述
使用栈进行表达式计算
💯CODE代码:
#include <bits/stdc++.h>
#pragma GCC optimize(2)
#define fi first
#define se second
#define min3 (x , y , z) min (x , min (y , z))
#define max3 (x , y , z) max (x , max (y , z))
using namespace std ;
typedef long long LL ;
typedef double LF ;
typedef pair < int , int > PII ;
typedef pair < string , int > PSI ;
stack < int > stk ;
stack < char > dlt ;
char c ;
int num ;
bool in = false ;
void deal () {
int x , y ;
char delet ;
y = stk.top () , stk.pop () ;
x = stk.top () , stk.pop () ;
delet = dlt.top () , dlt.pop () ;
if (delet == '+')
stk.push (x + y) ;
else if (delet == '-')
stk.push (x - y) ;
else if (delet == '*')
stk.push (x * y) ;
else if (delet == '/')
stk.push (x / y) ;
else if (delet == '^')
stk.push (pow (x , y)) ;
}
int level (char delet) {
if (delet == '+' || delet == '-')
return 1 ;
else if (delet == '*' || delet == '/')
return 2 ;
else if (delet == '^')
return 3 ;
else
return 0 ;
}
int main ()
{
while (cin.get (c)) {
if (isdigit (c)) {
num = num * 10 + c - '0' ;
in = true ;
continue ;
}
if (in)
stk.push (num) , num = 0 , in = false ;
if (c == '(')
dlt.push (c) ;
else if (c == ')') {
while (! dlt.empty () && dlt.top () != '(')
deal () ;
dlt.pop () ;
} else if (level (c) >= 1 && level (c) <= 3) {
while (! dlt.empty () && level (dlt.top ()) >= level (c))
deal () ;
dlt.push (c) ;
}
}
if (in)
stk.push (num) ;
while (! dlt.empty ())
deal () ;
cout << stk.top () ;
return 0 ;
}