C语言 任意表达式求值。(栈的应用

2025-04-04 18:04:23
推荐回答(2个)
回答1:

/*** 只适合整数的表达式求值 ***/
/***其中部分可作修改,表达式也可是输入的***/
#include "iostream.h"
const int n0=30;
int s1[n0+1]; //操作数栈
char s2[n0+1]; //运算符栈
int t1,t2;
int num[4]; //提取表达式中的整数

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;
}
//结果压入操作数栈
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[]="5*(40+6)-39";
cout< cout<<"其中的数字为:\n";
for (int i=0;i<4;i++)
{
cout< }
cout<}
原来做过的东西,是C++的,VC++6.0环境下调试运行成功。

回答2:

/***
只适合整数的表达式求值
***/
/***其中部分可作修改,表达式也可是输入的***/
#include
"iostream.h"
const
int
n0=30;
int
s1[n0+1];
//操作数栈
char
s2[n0+1];
//运算符栈
int
t1,t2;
int
num[4];
//提取表达式中的整数
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;
}
//结果压入操作数栈
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[]="5*(40+6)-39";
cout<cout<<"其中的数字为:\n";
for
(int
i=0;i<4;i++)
{
cout<';
}
cout<}
原来做过的东西,是C++的,VC++6.0环境下调试运行成功。