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;
}