描述

给出一个表达式,其中运算符仅包含+,-,*,/,^(加 减 乘 整除 乘方)要求求出表达式的最终值

数据可能会出现括号情况,还有可能出现多余括号情况

数据保证不会出现>=2^31的答案

数据可能会出现负数情况

输入格式

仅一行,即为表达式

输出格式

仅一行,既为表达式算出的结果

样例输入

(2+2)^(1+1)

样例输出

16

数据范围与约定

  • 表达式总长度<=30

题解:就是一个中缀转后缀的表达式计算,只不过加了一个^符号,优先级高于*/;

//#include<bits/stdc++.h>
#include<algorithm>
#include <iostream>
#include  <cstdlib>
#include  <cstring>
#include  <cassert>
#include   <cstdio>
#include   <vector>
#include   <string>
#include    <cmath>
#include    <queue>
#include    <stack>
#include      <set>
#include      <map>
using namespace std;
#define P(a,b,c) make_pair(a,make_pair(b,c))
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define CLR(vis) memset(vis,0,sizeof(vis))
#define MST(vis,pos) memset(vis,pos,sizeof(vis))
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef pair<int,pair<int,int> >pii;
typedef long long ll;
const ll mod = 1000000007;
const int INF = 0x3f3f3f3f;
ll gcd(ll a, ll b) {
	return b ? gcd(b, a%b) : a;
}
using namespace std;
template <class T>
inline bool scan_d(T &ret) {
	char c;
	int sgn;
	if(c=getchar(),c==EOF) return 0; //EOF
	while(c!='-'&&(c<'0'||c>'9')) c=getchar();
	sgn=(c=='-')?-1:1;
	ret=(c=='-')?0:(c-'0');
	while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
	ret*=sgn;
	return 1;
}
inline void outt(int x) {
	if(x>9) outt(x/10);
	putchar(x%10+'0');
}

const int maxn=1e6+10;
stack<int> num;
stack<char> ch;
int len;
int getnum(char a) {
	if(a=='+'||a=='-')
		return 0;
	else if(a=='*'||a=='/')
		return 1;
	else if(a=='^')
		return 2;
	return -1;
}
void count() {
	int a=num.top();
	num.pop();
	if(ch.top()=='+')
		a=num.top()+a;
	else if(ch.top()=='-')
		a=num.top()-a;
	else if(ch.top()=='*')
		a=num.top()*a;
	else if(ch.top()=='/')
		a=num.top()/a;
	else if(ch.top()=='^') {
		int temp=1;
		for(int i=0; i<a; i++)
			temp*=num.top();
		a=temp;
	}
	num.pop();
	num.push(a);
	ch.pop();
}
int main() {
	string s;
	cin>>s;
	if(s[0]=='-')s="0"+s;
	for(int i=2; i<s.size(); i++)
		if(s[i]=='-' && s[i-1]=='(') {
			s.insert(i,"0");
			i++;
		}
	len=s.size();
	for(int i=0; i<len; i++) {
		if(s[i]>='0'&&s[i]<='9') {
			int x=0;
			while(s[i]>='0' && s[i]<='9')
				x=x*10+s[i]-'0',i++;
			num.push(x);
			i--;
		} else if(s[i]==')') {
			while(num.size()>1 && ch.top()!='(') {
				count();//符号出栈即计算 
			}
			if(!ch.empty())
				ch.pop();
		} else if(s[i]=='(') {
			ch.push(s[i]);
		} else {

			while(num.size()>1 && getnum(ch.top())>=getnum(s[i])) {
				count();//符号出栈即计算 
			}
			ch.push(s[i]);
		}
	}
	while (!ch.empty() && ch.top()!='(') {
		count();
	}
	printf("%d\n",num.top());
	return 0;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注