华为机试之括号匹配

来源:互联网 发布:vb.net socket入门 编辑:程序博客网 时间:2024/06/05 21:16

题目描述:

输入一串字符串,其中有普通的字符与括号组成:包括‘(’‘)’‘[’ ']',要求验证括号是否匹配,如果匹配则输出0,否则输出1.

题目思路:  严蔚敏数据结构书上49页有写,可以模拟栈的操作。检验括号是否匹配的方法用期待的急迫程度来描述。

[  ( [  ] [  ]  )   ]

当计算机接受了第一个括号后,它期待着与其匹配的第8个括号的出现,然而等来的确实第2个括号,此时第一个括号[   只能靠边,而迫切等待与第2个括号相匹配的。。。依次类推。

这个处理过程与栈的特点相吻合,由此,在算法中设一个栈,每读入一个括号,若是右括号,则或者使置于栈顶的最急迫的期待得以消解,或者是不合法的情况。若是左括号,则作为一个新的更急迫的期待压入栈中,自然使原来的在栈中的所有未消解的期待的急迫性都降了一级。本题只是假如个其他字符。

#include<iostream>using namespace std;#define m 20typedef char ElemType;typedef struct stacknode{ElemType stack[m];int top;}stacknode;stacknode *sp;
//初始化一个栈void Init(stacknode *st){st->top = 0;}//push操作void Push(stacknode *st,ElemType x){if(st->top == m)cout<<"The stack is overflow"<<endl;else{st->stack[st->top] = x;(st->top)++;}}void Pop(stacknode *str,ElemType &e){(str->top)--;e = str->stack[str->top];}bool Panduan(char *s){sp = (stacknode*)malloc(sizeof(stacknode));Init(sp);char e;for(int i = 0;i<strlen(s);i++){if(s[i]!=']'&&s[i]!= ')')Push(sp,s[i]);else if(s[i] == ']'){Pop(sp,e);while(e!='['&&e!= '('){Pop(sp,e);}if(e == '('){return false;}}else if(s[i] == ')'){Pop(sp,e);while(e!='['&&e!= '('){Pop(sp,e);}if(e == '['){return false;}}}if(sp->top == 0)return 1;elsereturn 0;}int main(){char s[m];while(gets(s)){cout<<Panduan(s)<<endl;}system("pause");return 0;}


0 0