用C++求表达式求值

问题描述:从键盘上输入一个中缀表达式以#号结束,通过调用表达式求值算法求出表达式的值。
提示:用两个栈实现:一个操作数栈,一个操作符栈。

第1个回答  2008-12-16
以下代码已经编译运行通过:
#include<conio.h>

#include <stdlib.h>
#include<stdio.h>
#include<math.h>
#define max 100
char ex[max];
void trans()
{
char str[max];
char stack[max];
char ch;
int sum,j,t,top=0;
int i=0;/*?悢婍*/
printf("*****************************************\n");
printf("*?柧:埲 # 崋??恳?巙.\n");
printf("******************************************\n");
printf("昞?帵: ");
do
{
i++;
scanf("%c",&str[i]); /*拲: str[0]杤桳悢悩*/
if(i>=max) printf("昞?帏?搙??!");
}while(str[i]!='#' && i!=max);
sum=i; /*悢??搙,懄昞?帏?搙*/
t=1;
i=1;
ch=str[i];
i++;
while(ch!='#')
{
switch(ch)
{
case '(': top++;
stack[top]=ch;break;
case ')': while(stack[top]!='(')
{
ex[t]=stack[top];
top--;
t++;
}
top--;break;
case '+':
case '-': while(top!=0&&stack[top]!='(')
{
ex[t]=stack[top];
top--;
t++;
}
top++;
stack[top]=ch;break;
case '*':
case '/': while(stack[top]=='*'||stack[top]=='/')
{
ex[t]=stack[top];
top--;
t++;
}
top++;
stack[top]=ch;break;
case ' ': break;
default: while(ch>='0'&&ch<='9')
{
ex[t]=ch;
t++;
ch=str[i];
i++;
}
i--;
ex[t]='&';
t++;
}
ch=str[i];
i++;
}
while(top!=0)
if(stack[top]!='(')
{
ex[t]=stack[top];
t++;
top--;
}
else
{
printf("error");
top--;
exit(0);
}
ex[t]='#';
printf("\n尨昞?帏惀: ");
for(j=1;j<sum;j++)
printf("%c",str[j]);
printf("\n岪?昞?帏惀: ");
for(j=1;j<t;j++)
printf("%c",ex[j]);
}
void compvalue()
{
float stack[max],d;
char ch;
int t=1,top=0;
ch=ex[t];
t++;
while(ch!='#')
{
switch(ch)
{
case '+': stack[top-1]=stack[top-1]+stack[top];/*崻悩?屿晞,?岘巐??屿*/
top--;break;
case '-': stack[top-1]=stack[top-1]-stack[top];
top--;break;
case '*': stack[top-1]=stack[top-1]*stack[top];
top--;break;
case '/': if(stack[top]!=0)
stack[top-1]=stack[top-1]/stack[top];
else
{
printf("\n\tchu0error!\n");
exit(0);
}
top--;break;
default: d=0;/*敾抐惀斲?悢帤,惀?彨悢帤帤晞?壔???揑悢?,涹擖?*/
while(ch>='0'&&ch<='9')
{
d=10*d+ch-'0';
ch=ex[t];
t++;
}
top++;
stack[top]=d;
}
ch=ex[t];
t++;
}
printf("\n?屿?壥?: %g\n",stack[top]);
}

void main()
{
trans();
compvalue();

getch();
}本回答被网友采纳

算数表达式求值c++
算法实现:使用两个栈,分别存放操作符和操作数。 1)置操作数栈为空,起始符#入运算符栈。 2)依次读入表达式中的每个字符,如是操作数,入操作数栈;如是运算符,和运算符栈顶符号比较优先权。直到表达式求值完毕,即##配对。 [cpp] view plain copy bool IsOperator(char ch) { if (ch == '+' || ch ...

C++表达求值
void main(){ int count = 0;printf("请输入表达式个数: ");scanf("%d", &count);float* presult = (float*)malloc(count*sizeof(float));char* pexpr = (char*)malloc(100*count);int i = 0;int j = 0;int k = 0;for (; i < count; ++i){ printf("请输入表达式%d:...

C++实现中缀表达式求值代码
inttop;};voidInitstack(sqstack*s){s->top=0;}voidPush(sqstack*s,elemtypex){if(s->top==maxsize-1)printf("Overflow\\n");else{s->top++;s->stack[s->top]=x;}}voidPop(sqstack*s,elemtype*x){if(s->top==0)printf("underflow\\n");else{*x=s->stack[s->top];s->top-...

C++实现中缀表达式求值
short flagOfIntTable = 0; short flagOfStruct = 0; struct line stackOfEP[maxSize];\/\/存储后缀表达式 short stackOfID[maxSize];\/\/存放符号 short countOfEP = 0; short countOfID = 0; const short INTEGER = 1; const short LEFT_B = 3; const short RIGHT_B = 4; ...

中缀表达式转后缀表达式并求值(C++链式栈实现)
实现后缀表达式求值函数。该函数同样利用栈,当遇到操作数时直接压栈;遇到运算符时,弹出栈顶两个操作数,进行运算后将结果压栈。循环进行直至表达式结束。通过这种方式,可以有效处理多位整数及负数的中缀表达式运算。使用类模板可以增加代码的复用性。最终,通过链式栈实现了中缀到后缀的转换与后缀表达式的...

c++表达式求值
\/*** 只适合整数的表达式求值 ***\/ \/***其中部分可作修改,表达式也可是输入的***\/ 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 ...

c++算术表达式求值演示
代码就不给你贴了,没意思,我举个例子,自己研究下。将中缀表达式(1+2)*((8-2)\/(7-4))变成等价的后缀表达式:计算上述后缀表达式的值:自己看下,过程很详细,应该看得明白,代码你照着这个例子转化下就行了,希望对你有帮助。

如何用C++编写个程序中缀表达式变成后缀表达式,并用后缀表达式求值
cout<<"正规表达式解析器,语言:C++,作者:曹扬^_^。"<<endl; cout<<"支持符号:+(加号),-(减号),*(乘号),\/(除号),((前括号),)(后括号),^(次方)。"<<endl; cout<<"键入exit可退出。"<<endl; cout<<"括号必须配对,负数应表示为\\"(0-?)\\",正数前不能加\\"+\\"号。"<<endl; cout<<"违反上...

C++:编写一个程序能读入并计算一个只包含加减运算的表达式,每个输入的...
中缀转后缀表达式,然后对后缀表达式求值就可以了,这样不仅可以包含加减,还可以包含乘除括号、平方、开方等等

(C++) 输入一个由数字、+、-、*、\/及括号组成的自述表达式,求其值。
float Pop_f(SqStack_f &S,float &e){ \/* 若栈不空,则删除运算数栈S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR *\/ if(S.top==S.base)return ERROR;e=*--S.top;return e;} char Pop_ch(SqStack_ch &S,char &e){ \/* 若栈不空,则删除运算符栈S的栈顶元素,用e返回...

相似回答