50分求一个将中缀表达式换为逆波兰式的程序(二叉树),注意运算符优先级

ynkmhp 2009-12-11 03:31:21
RT
最好c++版
...全文
203 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ynkmhp 2009-12-21
  • 打赏
  • 举报
回复
谢谢大家!
lhslktg 2009-12-18
  • 打赏
  • 举报
回复
f
jdpdnc 2009-12-17
  • 打赏
  • 举报
回复
楼主花大价钱等,还不如去图书馆找本书看看
主要是用堆栈,而难点在与优先级的设定,而其中又属2^2^2这种表达式更要注意
小小攻城师 2009-12-17
  • 打赏
  • 举报
回复
typedef int ElemType;

struct Stack{
ElemType *stack;
int top;
int MaxSize;
};
void InitStack(Stack& S)
{
S.MaxSize = 10;
S.stack = new ElemType[S.MaxSize];
if (!S.stack)
{
cerr<< "动态存储分配失败!"<< endl;
exit(1);
}
S.top = -1;
}

void Push(Stack& S, ElemType item)
{
if (S.top == S.MaxSize-1)
{
int k = sizeof(ElemType);
S.stack = (ElemType*)realloc(S.stack, 2*S.MaxSize*k);
S.MaxSize = 2*S.MaxSize;
}
S.top++;
S.stack[S.top] = item;
}

ElemType Pop(Stack& S)
{
if (S.top == -1)
{
cerr<< "Stack is empty!"<< endl;
exit(1);
}
S.top--;
return S.stack[S.top+1];
}

ElemType Peek(Stack& S)
{
if (S.top == -1)
{
cerr<< "Stack is empty!"<< endl;
exit(1);
}
return S.stack[S.top];
}

这是堆栈的一些操作 我也给楼主上去
小小攻城师 2009-12-17
  • 打赏
  • 举报
回复
int Precedence(char op)
{
switch(op)
{
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '(':
case '@':
default:
return 0;
}
}

void Change(char* s1, char* s2)
{
Stack r;
InitStack(r);
Push(r, '@');
int i = 0, j = 0;
char ch = s1[i];
while (ch != '\0')
{
if (ch == ' ')
ch = s1[++i];
else if (ch == '(')
{
Push(r, ch);
ch = s1[++i];
}
else if (ch == ')')
{
while (Peek(r) != '(')
s2[j++] = Pop(r);
Pop(r);
ch = s1[++i];
}
else if (ch == '+' || ch == '-' || ch == '*' || ch == '/')
{
char w = Peek(r);
while (Precedence(w) >= Precedence(ch))
{
s2[j++] = w;
Pop(r);
w = Peek(r);
}
Push(r, ch);
ch = s1[++i];
}
else
{
if ((ch < '0' && ch > '9') && ch != '.')
{
cout<< "中缀表达式错误!"<<endl;
exit(1);
}
while ((ch >= '0' && ch <= '9') || ch == '.')
{
s2[j++] = ch;
ch = s1[++i];
}
s2[j++] = ' ';
}
}
ch = Pop(r);
while (ch != '@')
{
if (ch == '(')
{
cerr<< "expression error!"<< endl;
exit(1);
}
else
{
s2[j++] = ch;
ch = Pop(r);
}
}
s2[j++] = '\0';
}



int main()
{
char s1[300], s2[300];
memset(s1, '\0', sizeof(s1)); //memset函数的原型在头文件cstring里面 记得包含
memset(s2, '\0', sizeof(s2));
cout<< "请输入中序表达式:"<< endl;
cin>> s1;
Change(s1, s2);
cout<< "逆波特兰式是:"<< endl;
cout<< s2;
}

这个是代码加测试的代码,我试过了。正确。
lhslktg 2009-12-17
  • 打赏
  • 举报
回复
jf
谢谢
小小攻城师 2009-12-16
  • 打赏
  • 举报
回复
楼主等一天
明天我给你代码
今天调试一下
ypb362148418 2009-12-16
  • 打赏
  • 举报
回复
这都N天了,你的帖子怎么还不结呢?
ynkmhp 2009-12-16
  • 打赏
  • 举报
回复
up
ynkmhp 2009-12-13
  • 打赏
  • 举报
回复
再顶一下
ypb362148418 2009-12-12
  • 打赏
  • 举报
回复
貌似清华大学的那本数据结构书上有完整的C++代码!
ynkmhp 2009-12-12
  • 打赏
  • 举报
回复
怎么没人帮我啊....
lovesi3344 2009-12-11
  • 打赏
  • 举报
回复
我会离散数学
ynkmhp 2009-12-11
  • 打赏
  • 举报
回复
自己顶一下

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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