我试图通过在c ++中使用树来将中缀转换为后缀和前缀。我将中缀表达式传递给createTree函数,并在代码中使用2个堆栈节点(用于存储已从堆栈中取出的操作数和运算符)和堆栈s(用于存储运算符)。当我输入具有相同优先级运算符的表达式或第一个运算符的优先级高于第二个运算符时,代码可以正常工作。例如:1 * 2/3或1/2 + 3。但是当我输入第一个运算符的优先级低于第二个运算符的表达式时,它将调试。例如:1 + 2/3。 我尝试调试它并找到DEBUG_ERROR("迭代器不能解除引用");我试图在互联网上找到所有与矢量相关的问题,这些问题我以前从未使用过。 我希望你们能帮助我
node *CreateTree(string post)
{
node *temp, *op1 , *op2;
stack<node*> tree;
stack<char> s;
int i = 0;
while (!tree.empty())
{
tree.pop();
}
for(i = 0; i<post.length();i++)
{
if (post[i]==' ') continue;
else if(IsOperand(post[i]))
{
node *temp = new node();
temp->in = post[i];
temp->left = NULL;
temp->right = NULL;
for(int j=i+1;j<post.length();j++)
{
if (IsOperand(post[j]))
{
temp->in+=post[j];
i = j;
}
else break;
}
tree.push(temp);
}
else if(isOperator(post[i]))
{
while(!s.empty() && s.top()!='(' && s.top()!='{' && s.top()!='[' && !hasHigherPrecedence(post[i],s.top()))
{
node *op1;
node *op2;
op2 = tree.top();
tree.pop();
op1 = tree.top();
tree.pop();
node *temp = new node();
temp->in = s.top();
temp->left = op1;
temp->right = op2;
root = temp;
s.pop();
tree.push(root);
}
s.push(post[i]);
}
else if(post[i]=='(')
{
s.push(post[i]);
}
else if(post[i]==')')
{
while(s.top()!='('&&!s.empty())
{
node *op1;
node *op2;
op2 = tree.top();
tree.pop();
op1 = tree.top();
tree.pop();
node *temp = new node();
temp->in = s.top();
temp->left = op1;
temp->right = op2;
root = temp;
s.pop();
tree.push(root);
}
s.pop();
}
else if(post[i]=='[')
{
s.push(post[i]);
}
else if(post[i]==']')
{
while(s.top()!='['&&!s.empty())
{
node *op1;
node *op2;
op2 = tree.top();
tree.pop();
op1 = tree.top();
tree.pop();
node *temp = new node();
temp->in = s.top();
temp->left = op1;
temp->right = op2;
root = temp;
s.pop();
tree.push(root);
}
s.pop();
}
else if(post[i]=='{')
{
s.push(post[i]);
}
else if(post[i]=='}')
{
while(s.top()!='{'&&!s.empty())
{
node *op1;
node *op2;
op2 = tree.top();
tree.pop();
op1 = tree.top();
tree.pop();
node *temp = new node();
temp->in = s.top();
temp->left = op1;
temp->right = op2;
root = temp;
s.pop();
tree.push(root);
}
s.pop();
}
else cout<<post[i]<<" is not registered as operator or operand";
}
while (!s.empty())
{
node *op1;
node *op2;
op2 = tree.top();
tree.pop();
op1 = tree.top();
tree.pop();
node *temp = new node();
temp->in = s.top();
temp->left = op1;
temp->right = op2;
root = temp;
s.pop();
}
return root;
}
以下是上面代码中调用的函数
bool isOperator(char a)
{
return(a=='+' || a=='*' || a=='^' || a=='/' ||
a=='-' || a=='%')? true:false;
}
int getWeight(char op)
{
int weight;
switch(op)
{
case '+' : case '-':
weight = 1;
break;
case '*':
case '/':
case '%':
weight = 2;
break;
case '^':
weight = 3;
break;
}
return weight;
}
bool hasHigherPrecedence(char a, char top)
{
int aW = getWeight(a);
int tW = getWeight(top);
return (aW > tW)? true : false;
}
答案 0 :(得分:0)
我找到了答案 我只是忘了插入tree.push(root)
while (!s.empty())
{
node *op1;
node *op2;
op2 = tree.top();
tree.pop();
op1 = tree.top();
tree.pop();
node *temp = new node();
temp->in = s.top();
temp->left = op1;
temp->right = op2;
root = temp;
tree.push(root);//I forgot this
s.pop();
}