注册 登录
编程论坛 数据结构与算法

栈的应用 括号的匹配问题

我是大懒虫 发布于 2013-04-07 23:33, 623 次点击
本人是一个刚学数据结构的菜菜鸟,想实现一下书本的所有代码,当打到链栈的应用就不会了
我试过下面的代码,当执行到遇到case)或者case]的时候时if的执行语句就不会执行了
跪求大神

链栈的定义

typedef char SElemType;
typedef struct StackNode{
    SElemType data;
    struct StackNode *next;
}StackNode,*LinkStack;
bool InitStack(LinkStack &S);

bool StackLength(LinkStack S);
bool GetTop(LinkStack S,SElemType &e);//用E返回S的栈顶元素
bool Push(LinkStack &S,SElemType e);//插入元素E为新的栈顶元素
bool Pop(LinkStack &S,SElemType &e);//删除S的栈顶元素,并用E返回其值
bool Matching();//括号的匹配

//链栈的初始化
bool InitStack(LinkStack &S)
{
    S=new StackNode;
    S->next=NULL;
    return true;
}
//栈的长度
bool StackLength(LinkStack S)
{
    int Length=0;
    while(S->next!=NULL)
    {
        Length++;
        S=S->next;
    }
    return true;
}
//返回栈顶元素
bool GetTop(LinkStack S,SElemType &e)
{
    if(S==NULL) return false;
    e=S->data;
    return true;
}
//添加元素
bool Push(LinkStack &S,SElemType e)
{
    LinkStack p;
    p=new StackNode;
   
    p->data=e;
    p->next=S;
    S=p;
    return true;
}
//删除栈顶元素
bool Pop(LinkStack &S,SElemType &e)
{
    LinkStack p;
    p=S;
    e=S->data;
    S=p->next;
    delete p;
    p=NULL;
    return true;
}




//括号的匹配
bool Matching()
{

    LinkStack S;
    InitStack(S);//初始化栈
    int flag=1;
    char c,e;
    cin>>c;
    while(c!='#'&&flag)//想写一个循环输入判断
    {
        switch(c)
        {
          case '['||'('://这样写可以吗?
            Push(S,c);
        
            break;
          case')':
            GetTop(S,e);
            if(StackLength(S)!=0&&e=='(')
                Pop(S,e);
            else flag=0;
            break;
          case']':
            GetTop(S,e);
            if(StackLength(S)!=0&&e=='[')
                Pop(S,e);
            else flag=0;
            break;
        }
        cin>>c;
    }
    if(StackLength(S)!=0&&flag==0)
        return false;
    return true;
}
主函数
int main()
{
    cout<<"请输入符号:";
    Matching();
    return 0;
}
3 回复
#2
我是大懒虫2013-04-09 00:12
哈哈,我终于搞定它了,原来第一个case是不能或这样写的,分开就可以了,虽然没有人回帖,不过自己坐自己的沙发挺好的
#3
fanpengpeng2013-04-09 12:26
case '['||'('://这样写可以吗?

这样写不会报错 但是他是是什么意思呢
case 后接一个常量表达式 这里 '['||'(' 就是这个常量表达式 他 等于常量值1
所以 只有当是一个ASCII为1的字符时才会被执行 而不是想当然的 [ 或 ( 的时候
应该写成
case '[':
case '(':
#4
我是大懒虫2013-04-09 23:50
回复 3楼 fanpengpeng
原来是这样,谢谢你了。
发帖后一天我才我知道是那里错了,但是不知道是怎么回事,谷歌又找不到答案。
还有就是我在switch结束时再加一个判断。这样觉得程序更好了。
呵呵,现在知道了原来书本的代码都不是可以实现的
1