括号匹配

/*
 * stack.cpp
 *
 *  Created on: 2013年12月28日
 *      Author: ly
 */


//关键在于return的优化,getchar,getch的理解,最后的栈不为空的判断


#include<stdio.h>
#include<string.h>
#include <stack>


int main()
{
std::stack<char> mystack;
char exp;
while(  (exp=getchar())!='#')
{
//if()
if(exp=='[' || exp=='{' ||exp=='(')
mystack.push(exp);
else if (exp==']' || exp=='}' ||exp==')')
{
   if(!mystack.empty())
   {
if(exp==']'&& mystack.top()=='[')
mystack.pop();
else if(exp=='}'&& mystack.top()=='{')
mystack.pop();
else if(exp==')'&& mystack.top()=='(')
mystack.pop();
else
{
 printf("don't match\n");
 return 1;


}
   }
   else
    {
       printf("don't match\n");
       return 1;
    }
}
}
//下面两句要放在循环外面。
if(!mystack.empty())
printf("don't match\n");
else
printf("match,bingo!\n");






return 1;
}


/*




#include<stdio.h>
#include<stdlib.h>
#include<string.h>






typedef char DataType ;


typedef struct snode
{
    DataType data;
    struct snode *next;
} LSNode;


void StackInitiate(LSNode **head)//初始化堆栈
{
    *head=(LSNode *)malloc(sizeof(LSNode));
    (*head)->next=NULL;
}


int StackNotEmpty(LSNode *head)//判断堆栈非空
{
    if(head->next==NULL)return 0;
    else return 1;
}


int StackPush(LSNode *head,DataType x)//入栈
{
    LSNode *p;


    p=(LSNode *)malloc(sizeof(LSNode));
    p->data=x;
    p->next=head->next;
    head->next=p;
    return 0;
}


int StackPop(LSNode *head,DataType *d)//出栈
{
    LSNode *p=head->next;


    head->next=p->next;
    *d=p->data;
    free(p);


    return 0;
}


int StackTop(LSNode *head,DataType *d)//取堆栈顶元素
{
    LSNode *p=head->next;


    *d=p->data;


    return 1;
}


void Destroy(LSNode **head)//撤消空间
{
    LSNode *p,*p1;


    p=*head;
    while(p!=NULL)
    {
        p1=p;
        p=p->next;
        free(p1);
    }
}


int main(void)
{


    int exp;
    LSNode *mystack;
    char c;


    StackInitiate(&mystack);


    while((exp=getchar())!='#')
    {
        if((exp=='(')||(exp=='[')||(exp=='{'))
            StackPush(mystack,exp);    //入 栈
        else if(exp==')'&& StackNotEmpty(mystack)&&
                StackTop(mystack,&c)&& c=='(')
            StackPop(mystack,&c);        //出栈
        else if(exp==')'&& StackNotEmpty(mystack)&&
                StackTop(mystack,&c)&& c!='(')
        {
            printf("不匹配");
            return 0;  //相当于优化,否则输出结果会出现重复的不匹配。且当前不匹配已经可以判断不匹配,后续
                       //字符无需比较
        }


        else if(exp==']'&& StackNotEmpty(mystack)&&
                StackTop(mystack,&c)&& c=='[')
            StackPop(mystack,&c);         //出栈
        else if(exp==']'&& StackNotEmpty(mystack)&&
                StackTop(mystack,&c)&& c!='[')
        {
            printf("不匹配");
            return 0;
        }


        else if(exp=='}'&& StackNotEmpty(mystack)&&
                StackTop(mystack,&c)&& c=='{')
            StackPop(mystack,&c);         //出栈
        else if(exp=='}'&& StackNotEmpty(mystack)&&
                StackTop(mystack,&c)&& c!='{')
        {
            printf("不匹配");
            return 0;
        }


        else if( ((exp==')')||(exp==']')||(exp=='}') )&&
                !StackNotEmpty(mystack))
        {
            printf("不匹配");
            return 0;
        }


    }


    if(StackNotEmpty(mystack))
    {
        printf("不匹配");
        Destroy(&mystack);
        return 0;
    }
    else
    {
        printf("匹配");
        return 0;
    }


    return 0;
}




 */





































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值