数据结构—栈应用(二)括号比配问题

来源:互联网 发布:订货软件 编辑:程序博客网 时间:2024/06/01 23:37

分析一下:
1,发现左括号就入栈发现右括号去找是否有与之匹配的左括号有匹配的就出栈,把与之匹配的左括号从栈中删除。以此类推; [ ( ) ]
2) 当发现某一个右括号时,如果此时的栈已空,说明右括号多于左括号; [ ( ) ] ]
(3) 从栈中弹出的左括号与当前检验的右括号类型不同,说明出现了括号交叉情况; [ ( ] ]
(4) 当表达式中输入的右括号全部匹配完后,发现栈还不为空,即还有左括号残留,说明左括号多于右括号。 [ [ ( ) ]

代码如下:

#include<stack>#include<cstring>#include<cstdio>#include<iostream>using namespace std;stack<char>p;string s;int main(){    int n;    cin>>n;    while(n--)    {        cin>>s;        int ok = 1;        if(s[0]==']'||s[0]==')')        {            ok = 0;        }        else{            for(int i=0;i<s.length();i++)            {                if(s[i]=='['||s[i]=='(') p.push(s[i]);                else if(s[i]==']')                {                    if(p.empty()||p.top()!='[') ok = 0;                    else p.pop();                }                else if(s[i]==')')                {                    if(p.empty()||p.top()!='(') ok = 0;                    else p.pop();                }               }            if(!p.empty()) ok = 0;        }        if(ok)        printf("Yes\n");        else        printf("No\n");         while(!p.empty())        {            p.pop();        }    }}
0 0