#include <iostream>
#include <string>
#include <queue>
#include <stack>
#include "NodeType.h"
using namespace std;
// Test if token is an operator
bool isOperator(char token);
int getPrecedence(char token);
bool comparePrecedence(char tokenA, char tokenB);
int main()
{
stack<char> tokenStack;
queue<char> tokenQueue;
string expression= "", postfix= "";
char x;
cout<<"Please enter a mathematical expression: "<<endl;
getline(cin, expression);
cout<<expression.length()<<endl;
for(int i = 0; i <= expression.length(); i++)
{
x = expression[i];
if(isdigit(x))
{
tokenQueue.push(x);
}
if(isOperator(x))
{
while((!tokenStack.empty()) && (comparePrecedence(x, tokenStack.top() == true)))
{
char z = tokenStack.top();
tokenQueue.push(z);
tokenStack.pop();
}
tokenStack.push(x);
}
if(x == '(')
{
tokenStack.push(x);
}
if(x == ')')
{
while((!tokenStack.empty()) && (tokenStack.top() != '('))
{
char z = tokenStack.top();
tokenQueue.push(z);
tokenStack.pop();
}
tokenStack.pop();
}
while(!tokenStack.empty())
{
char z = tokenStack.top();
tokenQueue.push(z);
tokenStack.pop();
}
}
return 0;
}
int getPrecedence(char token)
{
if((token == '+') || (token == '-'))
{
return 1;
}
else if((token == '*') || (token == '/'))
{
return 2;
}
else if ((token == '(') || (token == ')'))
return 0;
else
return 99;
}
// Test if token is an operator
bool isOperator(char token)
{
return token == '+' || token == '-' ||
token == '*' || token == '/';
}
bool comparePrecedence(char tokenA, char tokenB)
{
if(getPrecedence(tokenA) < getPrecedence(tokenB))
return true;
else
return false;
}
由于某种原因,我无法让我的代码正常工作。它总是抛出一个 线程1:EXC_BAD_ACCESS(代码= EXC_1386_GPFLT)错误。它也没有正确地放置&#39; +&#39;当我使用简单的字符串测试时签名,例如:(3 + 4)。 队列应该看起来像:34+但它保持3 + 4。在我看来,&#39; +&#39;操作员永远不会被推入堆栈。谁能帮助我找到我应该关注的重点?
答案 0 :(得分:1)
调试代码是一项宝贵的学习技巧,我认为它应该在学校中形成一个很多更重要的课程。
例如,如果您修改代码以输出所有堆栈和队列操作:
int main()
{
stack<char> tokenStack;
queue<char> tokenQueue;
string expression= "", postfix= "";
char x;
cout<<"Please enter a mathematical expression: "<<endl;
getline(cin, expression);
cout<<expression.length()<<endl;
for(int i = 0; i <= expression.length(); i++)
{
x = expression[i];
if(isdigit(x))
{
tokenQueue.push(x);
cout << "qpush A " << x << '\n';
}
if(isOperator(x))
{
while((!tokenStack.empty()) && (comparePrecedence(x, tokenStack.top() == true)))
{
char z = tokenStack.top();
tokenQueue.push(z);
cout << "spop G " << z << '\n';
cout << "qpush B " << z << '\n';
tokenStack.pop();
}
tokenStack.push(x);
cout << "spush E " << x << '\n';
}
if(x == '(')
{
tokenStack.push(x);
cout << "spush F " << x << '\n';
}
if(x == ')')
{
while((!tokenStack.empty()) && (tokenStack.top() != '('))
{
char z = tokenStack.top();
tokenQueue.push(z);
cout << "spop H " << z << '\n';
cout << "qpush C " << z << '\n';
tokenStack.pop();
}
cout << "spop I " << tokenStack.top() << '\n';
tokenStack.pop();
}
while(!tokenStack.empty())
{
char z = tokenStack.top();
tokenQueue.push(z);
cout << "spop J " << z << '\n';
cout << "qpush D " << z << '\n';
tokenStack.pop();
}
}
return 0;
}
并使用简单的3+4
运行它,您将看到以下输出:
qpush A 3
spush E +
spop J +
qpush D +
qpush A 4
所以你 将操作放在堆栈上。但是,您稍后将其从堆栈中取出并将其放在队列上,然后将下一个数字放在队列中。
这肯定是错误的顺序,但是,如果你检查代码,它不仅仅是一个错误顺序的两行代码(这太简单了)。
从堆栈转移到队列的代码是while
中的最终main()
循环,在每个单个字符后,将所有项目从堆栈传输到队列,有效地使你的堆栈变得多余。
那是你应该看的地方,但我会给你一个线索。 不希望在每个字符之后将堆栈转移到队列,仅针对涉及数字的那些。
解决那个问题之后可能还有其他问题,但是这个方法(每次做一些重要的事情时调试输出)应该能够提供足够的信息来修复出现的任何问题。