PTA 7-4 表示式求值_1
阿新 • • 發佈:2021-10-08
7-4 表示式求值_1
在一個表示式中,只有“(”,“)”,“0-9”,“+”,“-”,“*”,“/”,“^”,請求出表示式的值。(“/”用整數除法)。
輸入格式:
共1 行,為一個算式。 (算式長度<=30 其中所有資料在 0~2^31-1的範圍內)。
輸出格式:
共一行,為表示式的值。
輸入樣例:
在這裡給出一組輸入。例如:
1+(3+2)*(7^2+6*9)/(2)
結尾無空行
輸出樣例:
在這裡給出相應的輸出。例如:
258
結尾無空行
資料結構作業,非最優解,記錄一下:
#include<iostream> #include<stdlib.h> #include<malloc.h> #include<string.h> #include<math.h> #include<stdio.h> #include<stack> #define STACK_INIT_SIZE 105 #define STACKINCREMENT 2 #define ERROR 0 typedef char SElemType; using namespace std; static char priority[8]={8}; void priorityInit() { priority['#']=8; priority['+']=5; priority['-']=5; priority['*']=4; priority['/']=4; priority['^']=3; priority['(']=1; priority[')']=1; } SElemType Precede(SElemType t1,SElemType t2) { SElemType f; switch(t2) { case '+':if(t1=='('||t1=='=') f='<'; else f='>'; break; case '-':if(t1=='('||t1=='=') f='<'; else f='>'; break; case '*':if(t1=='*'||t1=='/'||t1==')'||t1=='^') f='>'; else f='<'; break; case '/':if(t1=='*'||t1=='/'||t1==')'||t1=='^') f='>'; else f='<'; break; case '^':if(t1==')'||t1=='^') f='>'; else f='<'; break; case '(':if(t1==')') { printf("ERROR1\n"); exit(ERROR); } else f='<'; break; case ')':switch(t1) { case '(':f='='; break; case '=':printf("ERROR2\n"); exit(ERROR); default: f='>'; } break; case '=':switch(t1) { case '=':f='='; break; case '(':printf("ERROR2\n"); exit(ERROR); default: f='>'; } } return f; } int Operate(int a,char o,int b) { switch(o) { case '+': return a+b; case '-': return a-b; case '*': return a*b; case '/': return a/b; case '^': return pow(a,b); default: printf("ERROR!\n"); break; } } int Calculate(stack<int> &N,stack<char> &O,char* a) { int len=strlen(a),i=0,temp=0,x=0,y=0; char op; a[len]='='; O.push('='); char ch=O.top(); while(ch!='='||a[i]!='=') { if(a[i]>='0'&&a[i]<='9') { temp=a[i]-'0'; i++; while(a[i]>='0'&&a[i]<='9') { temp=temp*10+a[i]-'0'; i++; } N.push(temp); } else { switch(Precede(ch,a[i])) { case'<':O.push(a[i]); // 棧頂元素優先權低 i++; break; case'=':ch=O.top();O.pop(); // 脫括號並接收下一字元 i++; break; case'>':op=O.top();O.pop(); // 退棧並將運算結果入棧 y=N.top(); N.pop(); x=N.top(); N.pop(); N.push(Operate(x,op,y)); } } ch=O.top(); } return N.top(); } int main() { stack<int> Num; stack<char> Op; char ciallo[105]; scanf("%[^\n]",&ciallo); cout<<Calculate(Num,Op,ciallo); return 0; }