中缀表达式转为前缀表达式

jinli218 2011-10-27 01:52:35
举例
3 输出 3
1 + 1 输出 (+ 1 1)
2 * 5 + 1 输出 (+ 1 (* 2 5))
2 * ( 5 + 1 ) 输出 (* (+ 1 5) 2)
3 * x + ( 9 + y ) / 4 输出 (+ (* 3 x) (/ (+ 9 y) 4))

这是我现有的代码:

#include<iostream>
#include<string>
using namespace std;
#define maxSize 100
class Stack{
public:
Stack() {top = -1 ; };
bool Push(char a)
{
if(!IsFull())
c[++top] = a;
else
return false;
return true;
}
bool pop(char &a)
{
if(!IsEmpty())
a = c[top--];
else
return false;
return true;
}
bool getTop(char &a)
{
if(!IsEmpty())
a = c[top];
else
return false;
return true;
}
bool IsEmpty()
{
return top == -1 ? true:false ;
}
bool IsFull()
{
return top == (maxSize-1) ? true:false ;
}
private:
char c[maxSize];
int top;
};

int string_length(string s)
{
int n;
for(n=0 ; s[n]!='\0' ; n++); //O(n)
n--;
return n;
}
int priority1(char a) //O(1)
{
if(a == '#')
return 0;
if(a == '(')
return 6;
if(a == '*' || a == '/')
return 4;
if(a == '+' || a == '-')
return 2;
if(a == ')')
return 1;
return false;
}
int priority2(char a)
{
if(a == '#')
return 0;
if(a == '(')
return 1;
if(a == '*' || a == '/')
return 5;
if(a == '+' || a == '-')
return 3;
if(a == ')')
return 6;
return false;
}

char pre_operator(string s, int n)
{
while(s[n] >= '0' && s[n] <= '9' || s[n] =='.')
pre_operator(s, --n);
return s[n];
}

int main()
{
string s;
char c[100];
char a,b;
cout<<"input string "<<endl;
cin>>s;
s = "#"+s;
int m = 0,n;
n = string_length(s);
Stack z;
z.Push('#');
while(n >= 0 && !z.IsEmpty()) //O(n*n)
{
if(isdigit(s[n]))
{//cout<<"n is "<<n<<endl;
z.getTop(a);
if(priority2(pre_operator(s, n)) >= priority1(a)) //O(n)
// if the priority2 of operator right before the s[n] is >= top character in stack,
//we need ')' here
{c[m++] = ')';cout<<"c is "<<pre_operator(s, n)<<endl;}
while(s[n] >= '0' && s[n] <= '9' || s[n] =='.')
c[m++] = s[n--];
c[m++] = ' ';

}
else
{
z.getTop(a);
if(priority1(a) < priority2(s[n]))
{
z.Push(s[n--]);
z.getTop(a);
}
else if(priority1(a) > priority2(s[n]))
z.pop(b) , c[m++] = b;
else
{
z.pop(b);
if(b == ')')
n--;
}
}
}
m--;

cout<<endl<<"prefix string is ";
for( ; m >=0 ; n++,m--) //O(n)
if(c[m] == '+' || c[m] == '-' || c[m] == '*' || c[m] == '/')
cout<<'('<<c[m];
else
cout<<c[m];
cout<<endl;
return 0;
}


问题是 输出的右括号不正确,输入是2+3*2, 输出是 (+ 2(* 3 2)
少了最后一个右括号
怎么让他输出正确的括号呢?



谢谢~~ 急用~~
天才高手帮帮忙~~
...全文
403 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
java1109 2011-10-28
  • 打赏
  • 举报
回复
N久之前写过一个..
jinli218 2011-10-27
  • 打赏
  • 举报
回复
不好意思,因为着急找答案

虽然代码是c++的,但主要找的是思路。

用java应该都是高手啦,所以c++ 和java都发了

如果知道怎么解答,麻烦告诉我~~ 不需要代码也可以,告诉一个思路
谢谢啦~~~
gukuitian 2011-10-27
  • 打赏
  • 举报
回复
走错了吧,这是java区

23,405

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧