您的位置:首页 > 理论基础 > 数据结构算法

数据结构实验之栈二:一般算术表达式转换成后缀式

2012-11-07 20:02 288 查看


数据结构实验之栈二:一般算术表达式转换成后缀式


Time Limit: 1000MS Memory limit: 65536K

题目描述

对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。

输入

输入一个算术表达式,以‘#’字符作为结束标志。

输出

输出该表达式转换所得到的后缀式。

示例输入

a*b+(c-d/e)*f#


示例输出

ab*cde/-f*+


    学了书上的二叉树建树后,想将表达式建成树然后采用后序遍历的方式输出后缀式,写出来后发现与书上建成的树,有点不一样,查了很多便,也没出现什么原因,在学校的oj上交了之后却发现对了,才知道书上的建树建错了,数据结构 P129上的。与大家分享一下

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
class num
{
public:
char c;
num *rchild,*lchild;
};
num *statck1[1000000];
char statck2[1000000];
char s1[1000000];
int main()
{
num *newnode();
void post(num *p);
int i,j,n,m,s,t;
int l;
int top1,top2;
num *pr,*pl,*p,*head;
gets(s1);
l=strlen(s1);
top1=top2=0;
for(i=0;i<=l-2;i++)
{
if(s1[i]=='+'||s1[i]=='-'||s1[i]=='*'||s1[i]=='/'||s1[i]=='(')
{
if(top2==0||s1[i]=='('||statck2[top2-1]=='(')
{
statck2[top2++]=s1[i];
}else if(s1[i]=='*'||s1[i]=='/')
{
if(statck2[top2-1]=='*'||statck2[top2-1]=='/')
{
p=newnode();
p->c=statck2[top2-1];
pr=statck1[--top1];
pl=statck1[--top1];
p->lchild=pl;
p->rchild=pr;
statck1[top1++]=p;
statck2[top2-1]=s1[i];
}else
{
statck2[top2++]=s1[i];
}
}else if(s1[i]=='+'||s1[i]=='-')
{
p=newnode();
p->c=statck2[top2-1];
pr=statck1[--top1];
pl=statck1[--top1];
p->lchild=pl;
p->rchild=pr;
statck1[top1++]=p;
statck2[top2-1]=s1[i];
}
}else if(s1[i]==')')
{
while(statck2[top2-1]!='(')
{
p=newnode();
p->c=statck2[--top2];
pr=statck1[--top1];
pl=statck1[--top1];
p->lchild=pl;
p->rchild=pr;
statck1[top1++]=p;
}
top2-=1;
}else if(s1[i]!=' ')
{
p=newnode();
p->c=s1[i];
statck1[top1++]=p;
}
}
while(top2>=1)
{
p=newnode();
p->c=statck2[--top2];
pr=statck1[--top1];
pl=statck1[--top1];
p->lchild=pl;
p->rchild=pr;
statck1[top1++]=p;
}
head=statck1[0];
post(head);
printf("\n");
return 0;
}
num *newnode()
{
num *p=new(num);
p->rchild=NULL;
p->lchild=NULL;
return p;
}
void post(num *p)
{
if(p)
{
post(p->lchild);
post(p->rchild);
printf("%c",p->c);
}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐