2 baidu 34387683 baidu_34387683 于 2016.03.22 17:59 提问

中缀表达式转换成后缀表达式,求大神帮忙找下错误,谢谢

#include
#include
typedef struct huozhui{
char c;
struct huozhui next;
}huozhui;
void push(huozhui *L,char x)
{
huozhui *p=(huozhui *)malloc(sizeof(huozhui));
p->c=x;
p->next=L->next;
L->next=p;
}
int isoperator(char x)
{
if(x=='+'||x=='-'||x=='
'||x=='/'||x=='('||x==')')
return 0;
else
return 1;
}
int bijiao(char x)
{
switch(x)
{
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;

}
return -1;
}
int isempty(huozhui *L)
{
return L->next==NULL;
}
void pop(huozhui *L)
{
if(L->next==NULL)
return ;
else
{
huozhui *p;
p=L->next;
L->next=p->next;
free(p);
}
}
char top(huozhui *L)
{
if(L->next==NULL)
return 0;
else
return L->next->c;

}
int main()
{
huozhui *L=(huozhui *)malloc(sizeof(huozhui));
L->next=NULL;
char s[100],key[200];
gets(s);
int i,k=0;
for(i=0;s[i]!='\0';i++)
{
if(isoperator(s[i])==1)
{
key[k++]=s[i];
}
else
{
if(isempty(L))
{
push(L,s[i]);
}
else
{
if(s[i]==')')
{
while(!isempty(L)&&top(L)!='(')
{
key[k++]=top(L);
pop(L);
}
pop(L);
}
else
{
if(s[i]=='(')
push(L,s[i]);
else
{
while(bijiao(top(L))>=bijiao(s[i])&&!isempty(L))
{
key[k++]=top(L);
pop(L);
}
push(L,s[i]);
}
}
}
}
}
huozhui *p=L->next;
while(p!=NULL)
{
key[k]=p->c;
p=p->next;
k++;
}
key[k]='\0';
for(i=0;i<k;i++)
{
if(i!=0)
printf(" ");
printf("%c",key[i]);
}
puts("");
return 0;
}

2个回答

devmiao
devmiao   Ds   Rxr 2016.03.22 18:01
devmiao
devmiao   Ds   Rxr 2016.03.22 18:01
baidu_34387683
baidu_34387683 我看过这个,请问我的什么地方错了,基本上数据都对,但交上去还是有一个测试数据错
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
栈的运用(中缀表达式转换为后缀表达式,并对后缀表达式求值。)
中缀表达式转换成后缀表达式的基本思想: 顺序扫描中缀表达式: 若读入的是一个运算分量,则输出; 若读入的是一个左括号,则入栈,栈中左括号的优先级被视为比任何操作符都低。 若读入的是一个操作符(如 + 或 -),其级别比栈顶元素级别高,则入栈,否则,栈顶元素出栈,输出。 若读入的是右括号,栈中元素出栈,输出,直到碰到左括号,左括号出栈,但不输
后缀表达式(4)-——中缀表达式到后缀表达式的转换,递归实现
本篇是介绍的是后缀表达式最难,也是最基本的一个问题。即如何将一个中缀表达式转化为后缀表达式。在网上可以找到许多非递归实现的示例代码,它们比本节介绍的代码要简洁且高效,可是不利于理解。本节舍近求远,介绍后缀表达式的递归实现方式,为的是把变换的中心思想解释清楚。 问题描述 输入: 是一串字符串,它表示的是包含加减乘除四则运算以及括号运算的中缀表达式。为了简单起见,我们假设表达式中的
中缀表达式转后缀表达式_求表达式的值
中缀转后缀需要遵守以下规则 1、操作数:直接输出 2、“(”:直接入栈 3、“)”:”将“(”以前的直接输出,并将“)”出栈(不输出) 4、运算符+-*/:将优先级不小于该运算符的操作符出栈,最后将该运算符入栈 5、最后将栈中的元素依次弹出 6、优先级*/大于+-大于()class InToSuf { public List<String> solve(String[] op)/
表达式/如何将中缀表达式转化成后缀表达式
首先介绍下什么是中缀表达式,后缀表达式。 表达式一般分为前缀表达式,中缀表达式和后缀表达式。其中我们最为熟悉的是中缀表达式,也就是书本上最常用的表示形式。中缀表达式是将运算符放在两个操作数的中间。 前缀表达式是将运算符放在两个操作数之前。后缀表达式(又称逆波兰表达式)是将运算符放在两个操作数之后。例如:中缀表达式(A+(B-C/D)*E)对应的前缀表达式是(+A*-B/CDE)对应的后缀表达式
利用栈将中缀表达式转换成后缀表达式,并将得到的后缀表达式求值
头文件:函数的声明 #include #include #include #define STACKSIZE 100 #define MAXSIZE 50 typedef char ElemType; typedef struct { ElemType stack[STACKSIZE]; int top; }SeqStack; typedef struct { float dat
【数据结构】中缀表达式转后缀表达式(带括号)用栈实现
中缀表达式:9+(3-1)*3+10/2 转化为后缀表达式:931-3*+102/+ 规则: 从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或是优先级不高于栈顶符号则栈顶元素依次出栈并输出,并将当前符号进栈,直到最终输出后缀表达式为止。 代码是用最简单的逻辑写的,没有绕任何弯子,绝对可以看懂。我是新手,勿喷望指正
利用栈的数据结构实现中缀表达式到后缀表达式的转换
本文中将介绍如何使用栈来实现简单的中缀表达式转换为后缀表达式。后缀表达式中不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。 中缀表达式转后缀表达式的方法:  1.遇到操作数:直接输出(添加到后缀表达式中)  2.栈为空时,遇到运算符,直接入栈  3.遇到左括号:将其入栈  4.遇到右括号:执行出栈操作,并将出栈的元
《数据结构和算法》之中缀表达式、后缀表达式转换
一,在上篇博文中讨论了逆波兰表达式的计算问题,在这里讨论一下中缀表达式如何转换为后缀表达式        问题示例:如何将1+(2-3)*4+10/5 转换为后缀表达式 1 2 3 - 4 * + 10 5 / +这样的输出        问题分析:        第一步,首先遇到第一个输入是数字1,数字在后缀表达式中都是直接输出,接着是符号“+”入栈                   
IT笔试题中经常出现的前缀、中缀、后缀表达式转换问题-----阿冬专栏
转载自:http://blog.csdn.net/antineutrino/article/details/6763722 做笔试题学习遇到,收集的最好的解释,通俗易懂。 它们都是对表达式的记法,因此也被称为前缀记法、中缀记法和后缀记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。 举例: (3 + 4) × 5 - 6
中缀表达式转后缀表达式求值(模板)
///中缀表达式转后缀表达式 #include #include const int MAX=100; using namespace std; char pp[MAX];//存储转换后的后缀表达式 void trans(char *str)//将中缀表达式转换后缀表达式 { stackss; int i,j; i=0; j=0; while(str[i]!