先看题目:
编程实现计算由键盘输入的任一包含数字和加"+"、减"-"、乘"*"、除"/"及括号"("、")"等运算符的数学表达式。不要求对输入的合法性进行检测,若能对非法表达式判错更佳。
提示:建立两个栈结构,一个用于存储数值和中间运算结果,另一个用于存放操作符。
给出程序代码1:
#include "iostream.h"
const int n=31;
int s1[n]; //操作数栈
char s2[n]; //运算符栈
int t1,t2;
int num[10];
void calcu()
{
int x1,x2,x;
char p;
p=s2[t2--];
x2=s1[t1--];
x1=s1[t1--];
//进行一次运算
switch(p) {
case '+':x=x1+x2;
break;
case '-':x=x1-x2;
break;
case '*':x=x1*x2;
break;
case '/':x=x1/x2;
break;
}
s1[++t1]=x;
}
int calculator(char *f)
{
int v,i = 0;
char *p = f;
t1 = t2 = 0;
while (*p!='\0')
switch(*p) {
case '+': case '-':
while (t2&&(s2[t2]!='('))
//执行先遇到的加、减、乘、除运算
calcu();
//当前运算符进栈
s2[++t2] = *p;
p++;
break;
case '*': case '/':
if (t2&&(s2[t2]=='*')||(s2[t2]=='/'))
//执行先遇到的乘、除运算
calcu();
//当前运算符进栈
s2[++t2]=*p;
p++;
break;
case '(':
//左括号进栈
s2[++t2]=*p;
//读下一个字符
p++;
break;
case ')':
while (s2[t2]!='(')
//执行括号内的加、减、乘、除运算
calcu();
//弹出左括号
t2--;
p++;
break;
default:
//把字符串转换成整数值
v=0;
do {
v=10*v+*p-'0';
p++;
} while((*p>='0')&&(*p<='9'));
//操作数进栈
s1[++t1]=v;
num[i++]=v;
};
//执行先遇到的加、减、乘、除运算
while (t2)
calcu();
return s1[t1];
}
void main()
{
char a[] = "3-5*(4*13-50)";
//char a[]="5*(40+6)-39";
//char a[100];
//cin >> a;
cout<<calculator(a)<<endl;
cout<<"其中的数字为:\n";
for (int i=0;i<10;i++)
{
cout<<num[i]<<' ';
}
cout<<endl;
}