【问题标题】:Infix to postfix conversion using stacks (linked lists) in C++在 C++ 中使用堆栈(链表)进行中缀到后缀转换
【发布时间】:2012-04-03 06:14:46
【问题描述】:

大家好!我是 C++ 新手(在 stackoverflow 中也是如此),我需要各位专家的帮助。即使没有错误或警告,此代码也有问题。它只是在程序执行时挂起。

该程序使用链表(堆栈)将中缀转换为后缀。

# include <iostream>
# include <cstring>

 using namespace std;

 struct node {
    char data;
    node *next;
 };

 node *top=NULL;
 node *bottom=NULL;
 node *entry;
 node *last_entry;
 node *second_last_entry;

 void push(const char Symbol) {
    entry=new node;
    if(bottom==NULL) {
         entry->data=Symbol;
         entry->next=NULL;
         bottom=entry;
         top=entry;
    }
    else {
         entry->data=Symbol;
         entry->next=NULL;
         top->next=entry;
         top=entry;
    }
}

const char pop( ) {
    char Symbol=NULL;

    if(bottom==NULL)
        cout<<"\n\n\n\t ***  Error : Stack is empty. \n"<<endl;

    else {
        for (last_entry=bottom; last_entry->next!=NULL; last_entry=last_entry->next)
            second_last_entry=last_entry;

        if(top==bottom)
        bottom=NULL;

        Symbol=top->data;

        delete top;

        top=second_last_entry;
        top->next=NULL;
    }

    return Symbol;
}

void infix_to_postfix(const char *Infix) {
    char Infix_expression[100]={NULL};
    char Postfix_expression[100]={NULL};

    strcpy(Infix_expression,"(");
    strcat(Infix_expression,Infix);
    strcat(Infix_expression,")");

    char Symbol[5]={NULL};
    char Temp[5]={NULL};

    for(int count=0;count<strlen(Infix_expression);count++) {
        Symbol[0]=Infix_expression[count];

        if(Symbol[0]=='(')
            push(Symbol[0]);

        else if(Symbol[0]==')') {
           Symbol[0]=pop( );

           while(Symbol[0]!='(')
              {
             strcat(Postfix_expression,Symbol);

             Symbol[0]=pop( );
              }
        }

         else if(Symbol[0]=='^' || Symbol[0]=='*' || Symbol[0]=='/'
                    || Symbol[0]=='+' || Symbol[0]=='-')
        {
           if(Symbol[0]=='*' || Symbol[0]=='/')
              {
             Temp[0]=pop( );

             while(Temp[0]=='^' || Temp[0]=='*' || Temp[0]=='/')
                {
                   strcat(Postfix_expression,Temp);

                   Temp[0]=pop( );
                }

             push(Temp[0]);
              }

           else if(Symbol[0]=='+' || Symbol[0]=='-')
              {
             Temp[0]=pop( );

             while(Temp[0]!='(')
                {
                   strcat(Postfix_expression,Temp);

                   Temp[0]=pop( );
                }

             push(Temp[0]);
              }

           push(Symbol[0]);
        }

         else
        strcat(Postfix_expression,Symbol);
      }

       cout<<"\n\n Postfix Expression : "<<Postfix_expression;
}

 int main( ) {
    char Infix_expression[100]={NULL};
    cout<<"\n\n Enter the Infix Expression : ";
    cin>>Infix_expression;
    infix_to_postfix(Infix_expression);
    return 0;
}

请帮帮我!我是新手,没有你们我走不了多远。非常感谢!

【问题讨论】:

  • 你知道如何在调试器中运行你的代码吗?
  • 恐怕不行。顺便说一句,我正在使用代码块。
  • 我猜你需要学习如何调试才能真正解决这个问题。
  • 你的代码看起来很奇怪(至少它肯定可以从几个帮助方法和重组中受益)。我假设你已经阅读了 wiki 上的shunting yard article

标签: c++ linked-list stack infix-notation postfix-notation


【解决方案1】:

我想您需要的帮助是学习如何使用该 IDE 调试代码。您可以尝试的第一件事是添加更多打印(通过cout)以更清楚地查看发生了什么并找到程序挂起的位置(或者它是否卡在无限循环中)。

Here 是一个展示如何使用代码块进行调试的教程。可悲的是,我不知道这是否符合您的配置。

【讨论】:

  • 谢谢你,J.N.!但是我使用的代码块只是免费下载的,我无法访问构建选项来调试代码。
  • @FirstLady 您确实应该使用允许调试的 IDE。但是查看代码块的维基页面..它是在 GPL 下发布的,所以我不太明白你的意思。无论如何,还有 eclipse CDT(适用于 *nix、windows、no idea mac)和适用于 windows 的 VS express。
  • 谢谢你,呜!我会寻找eclipse CDT。谢谢! :)
【解决方案2】:

对于堆栈,您只需要一个堆栈指针。

void push(const char Symbol) {
    entry = new node;
    entry->data = Symbol;
    entry->next = top;
    top = entry;
}


const char pop( ) {
    if (!top) {
        cout << "\n\n\n\t ***  Error : Stack is empty. \n" << endl;
        return ' ';
    }
    node* entry = top;
    top = top->next;
    char ch = entry->data;
    delete entry;
    return ch;
}

const bool is_empty() {
    return !top;
}

这应该可以解决一些错误,但可能不是全部。有时我看到用两个栈做同样的事情:一个用于操作符,一个用于操作数。我不一定建议这样做。而是从零开始,保持算法简单抽象,可能先用伪代码。

【讨论】:

  • 嘿,它现在开始工作了!非常感谢你,乔普·埃根!更多祝福!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2015-09-13
  • 2012-09-22
  • 2013-03-28
  • 1970-01-01
  • 2015-09-12
  • 2013-02-26
  • 2013-07-12
  • 2015-04-19
相关资源
最近更新 更多