C ++理解问题链接列表和堆栈

时间:2014-06-16 08:16:25

标签: c++ linked-list stack parentheses

我必须制作一个代码,检查括号是否使用堆栈链接列表进行平衡。 这是我的代码,我使用了我班上的许多教程和power point演示文稿,并且还得到了我朋友的一些帮助。 但是,任何人都可以解释在“流行音乐”下发生的事情。和'检查'零件,逐行(我把它作为评论部分,我不明白)?我对理解c ++的这一部分(已实现的堆栈和l.lists)有疑问,而且我没有能够解释它并且有时间的人。我尝试过很多东西,但我真的不明白。 附:代码可以正常工作 谢谢你们!

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

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

int pop(node *&stack)  //node that points to address of a stack?
{
    char result;
    node *top=new node; //how can i explain this?
    top=stack; //why are we equalizing top with stack?
    result=top->data;//i dont understand
    stack=top->link;//dont understand   
    delete top; 
    return result; 
}

bool Pairs(char openP,char closedP)
{
if(openP == '(' && closedP == ')') return true;
else if(openP == '{' && closedP == '}') return true;
else if(openP == '[' && closedP == ']') return true;
else return false;
}

bool Check(string exp) 
{
   int i=0;
   node *stack=NULL;
    while(exp[i]) 
    {
        if(exp[i]=='(' || exp[i]=='[') 
           {
                node *neww=new stack;//dont understand
                neww->data=exp[i];//dont understand
                neww->link=stack; //-II- 
                stack=neww; //-II-
            }
        if(exp[i]==')' || exp[i]==']')
          {
             if(stack==NULL)
                return 0; 
             else if (Pairs(pop(stack), exp[i])==0) //what does mean this part in parentheses? 
                return 0;                           
          }
        i++;
    }
    if(stack==NULL)
        return 1;
    else
        return 0;
} 

int main()
{
    string exp;
    cout<<"Enter parentheses:\n";
    cin>>exp;
    if(Check(exp)!=0)
        cout<<"P. are  balanced";
    else 
        cout<<"P. are not balanced";  
    return 0;
}    

1 个答案:

答案 0 :(得分:0)

我建议采用以下方法:

  • 考虑一下忽略语言细节的算法。堆栈是正确的方法,但在您考虑算法之前,您不需要考虑如何实现堆栈。

  • 决定你需要一个给定的数据结构,在发明自己的数据结构之前,先问问自己是否已经存在于C ++(std :: stack)中。

  • 使用C ++习语不是C语言(即使用迭代器begin()和end()而不是索引)除了其他任何东西,这将阻止你的exp [i] bug。

  • 没有一个班级不止一件事。如果需要堆栈,则创建堆栈类,而不是让您的解析类涉及堆栈实现。首先,它更容易考虑检查算法,其次堆栈类可以在其他地方重复使用。

概括地说,您的解决方案将使用迭代器检查字符串的字符,并使用a来推送和弹出开括号 的的std ::堆栈&LT;炭&GT; 即可。 或指针无需任何地方。