用VC编程,现在输入一个表达式(例如a+b-c*d/(e+g)+f),要求输出其结果。

如题所述

我这里有个C++写的,参考一下吧:
#include <iostream>
#include <string.h>
using namespace std;
template <class T>
class Node
{
public:
T data;
Node<T> *next;
Node()
{
this->next = NULL;
}
Node(T data,Node<T> *next=NULL)
{
this->data = data;
this->next = next;
}
};

template <class T>
class LinkedStack
{
private:
Node<T> *top;
public:
LinkedStack();
~LinkedStack();
bool isEmpty();
void push(T x);
T pop();
T get();
};

template <class T>
LinkedStack<T>::LinkedStack()
{
top = NULL;
}

template <class T>
LinkedStack<T>::~LinkedStack()
{
Node<T> *p = top;
Node<T> *q;
while(p!=top)
{
q = p;
p = p->next;
delete p;
}
top = NULL;
}

template <class T>
bool LinkedStack<T>::isEmpty()
{
return top == NULL;
}

template <class T>
void LinkedStack<T>::push(T x)
{
top = new Node<T>(x,top);
}

template <class T>
T LinkedStack<T>::pop()
{
if(!isEmpty())
{
T x = top->data;
Node<T> *p = top;
top = top->next;
delete p;
return x;
}
throw "空栈,不能执行出栈操作";
}

template <class T>
T LinkedStack<T>::get()
{
if(!isEmpty())
{
return top->data;
}
throw "空栈,不能获得栈顶元素";
}

char * toPostfix(char *expstr)
{
LinkedStack<char> stack;
char *postfix = new char[strlen(expstr)*2];
int i=0;
int j=0;
char out ;
while(expstr[i]!='\0')
{
switch(expstr[i])
{
case'+':
case'-':
while(!stack.isEmpty()&&stack.get()!='(')
{
postfix[j++] = stack.pop();
}
stack.push(expstr[i++]);
break;
case'*':
case'/':
while(!stack.isEmpty()&&(stack.get()=='*'||stack.get()=='/'))
{
postfix[j++] = stack.pop();
}
stack.push(expstr[i++]);
break;
case'(':stack.push(expstr[i++]);
break;
case')':out = stack.pop();
while(!stack.isEmpty()&&out!='(')
{
postfix[j++] = out;
out = stack.pop();
}
i++;
break;
default:
while(expstr[i]>='0'&&expstr[i]<='9'&&expstr[i]!='\0')
{
postfix[j++] = expstr[i++];
}
postfix[j++]=' ';
break;
}
}
while(!stack.isEmpty())
{
postfix[j++]=stack.pop();
}
postfix[j]='\0';
return postfix;
}

int value(char *postfix)
{
LinkedStack<int> stack;
int i=0;
int result = 0;
while(postfix[i]!='\0')
{
if(postfix[i]>='0'&&postfix[i]<='9')
{
result = 0;
while(postfix[i]!=' ')
{
result = result*10+postfix[i++]-'0';
}
i++;
stack.push(result);
}
else
{
if(postfix[i]!=' ')
{
int y = stack.pop();
int x = stack.pop();
switch(postfix[i])
{
case'+':result = x + y;
break;
case'-':result = x - y;
break;
case'*':result = x *y;
break;
case'/':result = x / y;
break;
}
stack.push(result);
}
i++;
}
}
return stack.pop();
}

int main()
{
//char *expstr = "121+10*(52-49+20)/((35-25)*2+10)";
cout << "请输入表达式:";
//char *a ;
//cin >> *a;
char expstr[20]={0};
while(1)
{
cin>>expstr;
char *postfix = toPostfix(expstr);
cout << "expstr= "<<expstr << endl;
cout << "postfix= "<<postfix<<endl;
cout << "value= "<<value(postfix) << endl;
}
return 0;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-12-09
1、先判断表达式的括号配对是否正确;
2、如果表达式正确,则将其变成后缀表达式;
3、计算。后缀表达式的值,输出。
——到数据结构书中找相应的代码。
第2个回答  2011-12-09
关注

给定算式(a+b)\/c-(d-e)\/(f+g),写出该算式的波兰式与逆波兰式
逆波兰式ab+c\/ce-fg+\/- 不会的话私人教你一个简单的方法^-^:(a+b)\/c-(d-e)\/(f+g)在全部运算符左右都加上括号即:(((a+b)\/c)-((d-e)\/(f+g)))波兰式把全部符号写在括号前面即:-(\/(+(ab)c)\/(-(de)+(fg)))再去掉全部括号即:-\/+abc\/-de+fg 完成.同样逆波兰式把全...

...A+B*(C-D*(E+F)\/G+H)-(I+J)*K后缀表达式是? 希望有图表示
第一步:按照运算符的优先级对所有的运算单位加括号:式子变成了:((a+(b*c))-(d+e))后缀:把运算符号移动到对应的括号后面 则变成了:((a(bc)* )+ (de)+ )- 把括号去掉:abc*+de+- 后缀式子出现 这样得出规律,你要的结果就是 ABCDEF+*G\/-H+*+IJ+K*- ...

用c语言编写一个根据游戏规则输出判断结果
void main(){int a,b,c,d,e,f=0,g=0,h=0,num=0;float i,j,k=0;int caiquan1(int x);int caiquan2(int x);int shengfu1(int x,int y);int shengfu2(int x,int y);srand((int)time(0));printf("1=剪刀\\t2=锤子\\t3=布\\t0=结束\\n");printf("请输入\\n");while(1)...

画出表达式(A+B*C\/D)*E+F*G所对应的树结构,并写出该表达式的波兰表示式...
+ + e f g a \/ b c d

用win-masm调试出有问题,题目是x=((a*b)+c-d )\/(e +f)
DATAS SEGMENT A DW 1 B DW 2 G DW 3 D DW 4 E DW 1 F DW 1 X DW 0 ;此处输入数据段代码 DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX MOV AX,A MOV BX,B MUL BX ; 单...

...每个字母代表一个不同的数字,则其中A+B+C+D+E+F+G等于__
D+G=11C+F=10B+E=9A=1∴A+B+C+D+E+F+G=31

很无聊的问题,(A+B+C)(D+E+F)(G+H+I)(J+K+L)(M+N+O)是
=ADGJM+AEGJM+AFGJM+BDGJM+BEGJM+BFGJM+CDGJM+CEGJM+CFGJM+ADHJM+AEHJM+AFHJM+BDHJM+BEHJM+BFHJM+CDHJM+CEHJM+CFHJM+ADIJM+AEIJM+AFIJM+BDIJM+BEIJM+BFIJM+CDIJM+CEIJM+CFIJM+ADGKM+AEGKM+AFGKM+BDGKM+BEGKM+BFGKM+CDGKM+CEGKM+CFGKM+ADHKM+AEHKM+AFHKM+BDHKM...

(a+b)×c+(d-e)\/(f+g)先序,中序,后序遍历
先构造表达式的二叉树,再遍历就可以了 先序,也就是前缀表达式:+×+abc\/-de+fg 中序,也就是没有括号的中缀表达式:a+b×c+d-e\/f+g 后序,也就是后缀表达式:ab+c×de-fg+\/+

(13)逗号运算符,问号运算符,运算符混合计算
在表达式:a+b*c+d-e\/f-g*h?i?j;中,计算顺序为:先计算乘法c*d,然后加法b*c,接着继续进行加法a+b*c,随后执行除法e\/f,接着减法d-e\/f,最后进行减法计算g*h?i?j,最终结果等于a+(b*c)-(d-(e\/f))+(g*h?i?j)。在编程语言中,不同的数据类型用于表示不同的数值范围。

将赋值语句 x=a*b\/(c+2*d)+e*f+g 表示为相应的逆波兰式和四元式,多谢...
[e*f]+g+ ->[ab*]\/(c+2*d)][ef*]+g+ ->[[ab*]\/[c[2*d]+]]ef*+g+ ->[ab*][c[2*d]+]\/ef*+g+ ->ab*c2d*+\/ef*+g+ 四元式:(其中,t1,t2为中间变量)(*,a,b,t1)(*,2,d,t2)(+,c,t2,t2)(\/,t1,t2,t1)(*,e,f,t2)(+,t2,t1,t1)(+,t1,g,x)...

相似回答
大家正在搜