C++ 后置评估分割错误

C++ 后置评估分割错误,c++,stack,C++,Stack,我在使用堆栈进行后缀计算的代码中遇到了分段错误 请帮忙,谢谢 它不能仅根据我的调试进行输入。我觉得我的算法是正确的,方法也是正确的,但我在某个地方遗漏了一些小东西,或者犯了一个我找不到的愚蠢的错误。 我们将不胜感激。非常感谢 #include <iostream> #include <cstring> using namespace std; struct Stack { int data; Stack *next; }*top=NULL,*temp; voi

我在使用堆栈进行后缀计算的代码中遇到了分段错误 请帮忙,谢谢

它不能仅根据我的调试进行输入。我觉得我的算法是正确的,方法也是正确的,但我在某个地方遗漏了一些小东西,或者犯了一个我找不到的愚蠢的错误。 我们将不胜感激。非常感谢

#include <iostream>
#include <cstring>
using namespace std;

struct Stack {
  int data;
  Stack *next;
}*top=NULL,*temp;

void push(int item)
{
  Stack *new_node = new Stack;
  new_node->data=item;
  new_node->next=top;
  top=new_node;
}

int pop()
{
  int item;
  if (top==NULL)
    cout<<"stack underflow";

  else {
    temp=top;
    item=top->data;
    top=top->next;
    free(temp);
  }
  return item;
}

void evaluate(char postfix)
{
  int i,val;
  int A, B;
  
  ch - '0' is used for getting digit rather than ASCII code of digit */
  if (isdigit(postfix))  
    push(postfix - '0');
   
  else if (postfix == '+' || postfix == '-' || postfix == '*' || postfix == '/') 
  {
    A = pop();
    B = pop();
    switch (postfix)
    {
      case '*': val=B*A; break;
      case '/': val=B/A; break;
      case '+': val=B+A; break;
      case '-': val=B-A; break;
    }
    push(val);
  }
}

int main()
{
  int i;
  string exp;
  getline(cin,exp);
  for (i=0;i<exp.length();i++) 
    evaluate(exp[i]);
  cout<<"Value of "<<exp<<" is "<<pop();
  return 0;
}
#包括
#包括
使用名称空间std;
结构堆栈{
int数据;
堆栈*下一步;
}*top=NULL,*temp;
无效推送(整数项)
{
Stack*new_节点=新堆栈;
新建_节点->数据=项目;
新建节点->下一步=顶部;
top=新的_节点;
}
int-pop()
{
国际项目;
if(top==NULL)
coutnext;
免费(临时);
}
退货项目;
}
void求值(字符后缀)
{
int i,val;
INTA,B;
ch-“0”用于获取数字,而不是数字的ASCII码*/
if(isdigit(后缀))
推送(后缀为“0”);
else if(postfix='+'| | postfix='-'| | postfix='*'| | postfix=='/'))
{
A=pop();
B=pop();
开关(后缀)
{
案例“*”:val=B*A;中断;
案例“/”:val=B/A;中断;
案例“+”:val=B+A;中断;
案例'-':val=B-A;中断;
}
推(val);
}
}
int main()
{
int i;
字符串表达式;
getline(cin,exp);

对于(i=0;i请查看
pop
函数中的if语句:

  if (top=NULL)
    cout<<"stack underflow";

  else {
    temp=top;
    item=top->data;
    top=top->next;
    free(temp);
  }
if(top=NULL)
coutnext;
免费(临时);
}
top=NULL
始终使用
NULL
覆盖
top
,然后使用else分支(因为NULL为false),其中
top->data
将取消引用新分配的空指针


当您使用
pop()时,即使是像
5
这样简单的输入也会触发此问题
读取最终值。

当您在调试器下运行代码时,它在哪里崩溃?什么是最简单的输入仍然会触发崩溃?您在
top=NULL
中也有一个输入错误,该错误将使您的进程崩溃。如果您使用调试器一步一步地执行,则应该会很突出。evaluate()函数不起作用@Botje“不起作用”是一个无用的诊断。它是否崩溃?产生错误值?循环?用黄色企鹅填充屏幕?使用调试器,逐步检查程序,查看pop函数中出错的原因。if语句总是覆盖
top