gpt4 book ai didi

c++ - 中缀到后缀算法

转载 作者:行者123 更新时间:2023-11-28 07:43:03 29 4
gpt4 key购买 nike

我一直在研究一种将“a+b*c-d/e”转换为其后缀形式的算法。我已经准备好了 http://en.wikipedia.org/wiki/Shunting-yard_algorithm维基,但我的逻辑有问题。当我打印出我的队列时,我得到没有运算符(operator)的“a b c d e”。似乎没有任何东西被插入我的堆栈?或者如果是,它不会被插入我的队列。我的队列/堆栈由我创建的双链表类实现。

#include <iostream>
#include "LinkedList.h"
#include "Stack.h"
#include "Queue.h"
using namespace std;

int oper(char c)
{
switch(c) {
case '!':
return 4;
case '*': case '/': case '%':
return 3;
case '+': case '-':
return 2;
case '=':
return 1;
}
return 0;
}



int main () {

LinkedList* list = new LinkedList();


string infix = "a+b*c-d/e";
Stack *holder = new Stack();
Queue *newstring = new Queue();
int length = infix.length();
char temp;
char prev;
for(int i=0; i<length; i++)
{
temp = infix[i];
if((temp == '+') || (temp == '-') || (temp == '*') || (temp == '/'))
{
if (holder->isEmpty())
{
holder->push(temp);
prev = temp;
continue;
}
if(oper(temp)<oper(prev))
{
newstring->queue(holder->popStack());
temp = '\0';
continue;
}
else
holder->push(temp);
prev = temp;
}
else
newstring->queue(temp);

}
while(!holder->isEmpty())
{
newstring->queue(holder->popStack());
}
newstring->printQueue();



return 0;
}

最佳答案

你的代码部分::

        if(oper(temp)<oper(prev))
{
newstring->queue(holder->popStack());
temp = '\0';
continue;
}

这部分代码完全没有命中......输入中提供的字符串 "a+b*c-d/e"

看到这个::

 if(oper(temp)<oper(prev))

条件是在变量 temp 中检查前一个运算符相对于当前扫描的运算符的优先级,但在前一个 if 语句(堆栈为空的条件)之外没有语句从中提取或分配 prev 变量堆栈中可用的选项因此“+”的初始值用于评估小于“*”和“\”的 if 条件,并且与“-”处于同一级别但结果不大于第二个 if 条件永远得不到满足并且剂量被击中。

这可能就是为什么当您 pop 时没有任何东西从堆栈中出来,这就是您如何获得当前结果的原因。您将需要再次访问代码并进行适当的更改。

希望这对您有所帮助,祝您有美好的一天。

关于c++ - 中缀到后缀算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15458404/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com