我没有得到正确的输出为这个程序得到abcde-*给输入在主
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Stack{
int capacity;
int top;
int *array;
};
struct Stack* createstack(int capacity){
struct Stack* stack=(struct Stack*)malloc(sizeof(struct Stack));
stack->top=-1;
stack->capacity=capacity;
stack->array=(int*)malloc(sizeof(int)*capacity);
return stack;
}
char pop(struct Stack* stack){
return(stack->array[stack->top--]);
}
void push(struct Stack* stack,char ch ){
stack->array[++stack->top]=ch;
}
int isempty(struct Stack* stack){
return(stack->top==-1);
}
int isfull(struct Stack* stack){
return(stack->top==stack->capacity-1);
}
int isfront(struct Stack* stack){
return(stack->array[stack->top]);
}
int precedence(char ch){
switch(ch){
case 1: ch=='+';
case 2: ch=='-';
return 1;
case 3: ch=='*';
case 4: ch=='/';
return 2;
case 5: ch=='^';
return 3;
return-1;
}
}
int isoperand(char ch){
return(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z');
}
void infixtopostfix(struct Stack* stack,char* exp){
int i,k=-1;
char res[100];
for(i=0;exp[i];i++){
///if an operand is encountered
if(isoperand(exp[i]))
res[++k]=exp[i];
///if an operator is encountered
else{
// if(isempty(stack)||precedence(isfront(stack))<precedence(exp[i]))
//else
while(!isempty&&precedence(isfront(stack))>=precedence(exp[i]))
res[++k]=pop(stack);
push(stack,exp[i]);
}
}
while(!isempty(stack))
res[++k]=pop(stack);
res[++k]='\0';
printf("%s",res);
}
int main(){
struct Stack* stack=createstack(100);
char arr[100]="a+b+c*d-e";
infixtopostfix(stack,arr);
}
这个程序是将表达式从中缀转换为后缀这里是算法
算法1。从左到右扫描中缀表达式。
如果扫描的字符是操作数,则将其输出。
否则,
......3.1如果扫描的运算符的优先级大于堆栈中运算符的优先级(或者堆栈是空的),则推送它。......
3.2否则,从堆栈中弹出操作符,直到被扫描操作符的优先级小于-等于位于堆栈顶部的操作符的优先级。将扫描的操作员推送到堆栈。
我不知道这些是否是你唯一的问题,但我想到两件事:
正如@rici所指出的,您的优先级
函数没有按照您认为应该的方式工作。正确答案是:
int precedence(char ch){
switch(ch){
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '^':
return 3;
default:
return-1;
}
}
检查优先级时,有以下条件:
while(!isempty&&precedence(isfront(stack))>=precedence(exp[i]))
这是行不通的,因为!isempty
将始终计算为false。您在这里询问isempty
函数的地址是否为空。不是。您真正想做的是检查堆栈是否为空:
while(!isempty(stack) && precedence(isfront(stack))>=precedence(exp[i]))
这将调用is空
函数。
您真的应该学会使用调试器。单步执行代码会很快发现我上面提到的错误。
关于堆栈实现的一些注意事项。
您在pop
中有一个潜在的错误。如果有人在堆栈是空的时候调用它,它要么会崩溃,因为你试图访问数组[-1]
,要么会成功访问数组[-1]
,并返回一个虚假的值。您最好检查top
的值,并抛出异常(或用消息使程序崩溃),而不是返回错误的值。依赖于客户端在调用pop
之前调用是不可靠的。
在
push
中也有类似的错误。试图访问超出数组边界的内容是未定义的行为。程序可能会继续工作,并且可能会崩溃。在push
的情况下,您可能会推送一个随后被其他内容更改的值,然后pop
返回一个您没有推送的值。
由于
pop
中的错误,您的is空
函数也有一个错误。如果top
的递减值低于-1
,则isAir ty
将返回false
。与其检查==-1
,不如检查
查看堆栈顶部而不弹出堆栈的函数名通常称为
peek
,而不是isfront
。
本文向大家介绍将中缀转换为后缀表达式,包括了将中缀转换为后缀表达式的使用技巧和注意事项,需要的朋友参考一下 前缀表达式是人类可读和可解的。我们可以轻松地区分算子的顺序,也可以在计算数学表达式时先使用括号将其求解。计算机无法轻松地区分运算符和括号,这就是为什么需要后缀转换的原因。 要将中缀表达式转换为后缀表达式,我们将使用堆栈数据结构。通过从左到右扫描infix表达式,当我们得到任何操作数时,只需将
本文向大家介绍将中缀转换为前缀表达式,包括了将中缀转换为前缀表达式的使用技巧和注意事项,需要的朋友参考一下 要通过计算机求解表达式,我们可以将其转换为后缀形式或前缀形式。在这里,我们将看到中缀表达式如何转换为前缀形式。 首先,中缀表达式反转。注意,对于反转,圆括号也将反转。 例如:表达式:A + B *(C-D) 反转后的表达式为:)D – C(* B + A 因此我们需要将左括号转换为右括号,反
我正在尝试将后缀表达式转换为二叉树。My函数将标记(字符串)列表作为参数。 每次我给函数任何输入时,调试器都会写一条消息:函数“add”中的非穷举模式。 我的想法是:一个接一个地读取标记,然后确定它是运算符还是操作数。如果是操作数,则不要将任何节点保存到树中,并将数字存储到堆栈中。否则,我用操作符创建一个节点,从堆栈中弹出符号,将它们设置为新节点的子节点,并将操作符推送到堆栈中。 如果字符串列表为
本文向大家介绍中缀表达式转后缀表达式相关面试题,主要包含被问及中缀表达式转后缀表达式时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 对于中缀表达式,遇到操作数直接将其输出,如果遇到操作符和左括号全部压入栈中,若遇到右括号则将栈中元素全部弹出,直到遇到左括号为止。压栈过程中,若遇到其它操作符,从栈中弹出元素直到遇到更低优先级的操作符为止。
我的讲师给了我一个任务,让我创建一个程序,使用堆栈将表达式和中缀转换为后缀。我制作了堆栈类和一些函数来读取中缀表达式。 但是这个函数,叫做,它负责使用堆栈将数组inFix中的inFix表达式转换为数组postFix中的postfix表达式,并没有做它应该做的事情...你们能帮帮我告诉我哪里做错了吗? 下面是从中缀转换为后缀的函数的代码,是我需要帮助修复的代码: 注意:convertToPostfi
我试图在1次传递中评估一个内插表达式,而不将其转换为后缀,但它没有为某些表达式提供正确的输出。例如:3-5*10/5 10 , (45 5)-5*(100/10) 5 是否有人能在cpp中为这个问题提供适当的解决方案。 链接到上一个问题:如何使用堆栈在一次扫描中计算中缀表达式? 请不要将其标记为重复,因为我已经尝试了上述给定线程中回答的算法,但没有效果。