主题:运算表达式改为它对应的后缀表达式
木鱼凡心
[专家分:70] 发布于 2009-03-24 20:55:00
谁有 算法
把运算表达式 改为他对应的 后缀表达式
如:3/5+6 后缀表达式为:3 5 / 6 +
2*(8+9)/(1-5) 后缀表达式 为:2 8 9 + * 1 5 - /
把它放到字符数组里
回复列表 (共4个回复)
沙发
ydntlk [专家分:90] 发布于 2009-03-24 22:04:00
[code=c]
#include <iostream>
#include <string>
#include <stack>
#include <cstring>
#include <cctype>
using namespace std;
int c2v(char c)
{
switch (c) {
case '/': case '*': return 1;
case '+': case '-': return 0;
}
return -1;
}
int comp_oper(char c1, char c2)
{
return c2v(c1) - c2v(c2);
}
void expr2suffix(const char* expr, char* suffix)
{
stack<char> oper_stack;
string sfx;
for (int i = 0; i < strlen(expr); ++i) {
if (isdigit(expr[i]))
sfx += expr[i];
else if (expr[i] == '(')
oper_stack.push(expr[i]);
else if (expr[i] == ')') {
while (oper_stack.top() != '(') {
sfx += oper_stack.top();
oper_stack.pop();
}
oper_stack.pop();
} else if (expr[i] == '+' || expr[i] == '-' ||
expr[i] == '*' || expr[i] == '/') {
while (!oper_stack.empty()
&& comp_oper(expr[i], oper_stack.top()) <= 0) {
sfx += oper_stack.top();
oper_stack.pop();
}
oper_stack.push(expr[i]);
}
}
while (!oper_stack.empty()) {
sfx += oper_stack.top();
oper_stack.pop();
}
strcpy(suffix, sfx.c_str());
}
int main()
{
char s1[] = "3/5+6";
char s2[] = "2*(8+9)/(1-5)";
char* ss1 = new char[strlen(s1) + 1];
char* ss2 = new char[strlen(s2) + 1];
expr2suffix(s1, ss1);
expr2suffix(s2, ss2);
for (int i = 0; i < strlen(ss1); ++i)
cout << ss1[i] << ' ';
cout << endl;
for (int i = 0; i < strlen(ss2); ++i)
cout << ss2[i] << ' ';
cout << endl;
return 0;
}
[/code]
板凳
木鱼凡心 [专家分:70] 发布于 2009-03-28 21:17:00
int d[7][7]={2,2,1,1,1,2,2,
2,2,1,1,1,2,2,
2,2,2,2,1,2,2,
2,2,2,2,1,2,2,
1,1,1,1,1,0,-1,
2,2,2,2,-1,2,2,
1,1,1,1,1,-1,0};
char a[7]={'+','-','*','/','(',')','#'};
int i=0,j=0;
while(!(str1==a[i])) i++;
while(!(str2==a[j])) j++;
return d[i][j];
}
string Change(string expstr)
{
char A;
expstr+='#';
SqStack S1,S2;
InitStack (S1);//放 运算符
InitStack (S2);//放 后缀式
Push(S1, '#');
for(int i=0;i<expstr.length();)
{
int flag=1;
if(expstr[i]==' ') {i++;continue;}
while(expstr[i]>=48&&expstr[i]<=57)
{
Push(S2,expstr[i]);i++;
}
Push(S2,' ');
while(flag)
{
switch(Compare(GetTop(S1),expstr[i]))
{
case 2: A=Pop(S1);Push(S2,A);break;
case 1:Push(S1,expstr[i]); flag=0;break;
case 0: Pop(S1);flag=0;break;
default: flag=0; cout<<"Expression error!"<<endl;
if(EmptyStack(S1)) break;
}//switch
Push(S2,' ');
}//while(flag)
if(EmptyStack(S1)) break;
i++;
}//for
//expstr.clear();
SElemType *p=S2.base;
string str;
while( p<S2.top)
{
str +=* p;
p++;
}
cout<<str<<endl;
system ("pause");
return str;
}//Change
3 楼
akey307 [专家分:540] 发布于 2009-03-29 08:42:00
你可以参考一下“数据结构的C++伪码实现”, 第154页, 很经典的一本书。
4 楼
木鱼凡心 [专家分:70] 发布于 2009-04-19 22:48:00
谢谢 是英文版吗 我怕我看不懂
我来回复