括号匹配 c++实现
注意 不要把题目想复杂了 不要想各种可能性
初学者不建议用stack.h的头文件 多多打栈各种功能的实现 加深自己对栈的理解
满足:{}[()]、{[()]}、()[]{} 即可
(笔者当时就在想各种刁钻的字符串 只是自寻烦恼 重要的还是从这个题了解到后进先出的思想 后面再多刷一些这样的题 )
要是还是看不太懂这个题 笔者 先放上一个简单的代码 没有明显用到栈的思想
第二个代码 是为应用栈
本程序缺陷:只有当输入的字符左右括号都有 才能运行 例如(((((输出会是yes
可以把一些宏定义结构体定义写为一个头文件 提高代码的复用性
注意引用自己写的头文件是用双引号 注意函数是传指针还是传引用
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
string str;
cin>>str;
char s[1000];
int top=0;
int flag=1;//判断作用的变量
for(int i=0; i<str.length(); i++)
{
if(str[i]=='('||str[i]=='['||str[i]=='{') //把非括号的字符筛出去 ,有用的是左括号
s[top++]=str[i];
else
{
if(str[i]==')')
{
if(s[--top]!='(')
{
flag=0;
break;
}
}
else if(str[i]=='}')
{
if(s[--top]!='{')
{
flag=0;
break;
}
}
else
{
if(s[--top]!='[')
{
flag=0;
break;
}
}
}
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
//接下来 是应用栈的
#include<iostream>
using namespace std;
#define stack_size 1000
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status;
//顺序栈的存储结构定义
typedef struct{
char *base;
char *top;//栈的出栈和入栈操作都只在栈顶端操作 因此设置栈顶指针 通常指示栈顶元素的下一个存储位置
}SqStack;
#include"zhan.h"
//栈的初始化
Status InitStack(SqStack &s)
{
s.base=new char[MAXSIZE];
if(!s.base)
return OVERFLOW;
s.base=s.top;
return OK;
}
//入栈
Status push(SqStack &s,char &c){
if(s.top-s.base==MAXSIZE)
return ERROR;
*s.top=c;
s.top++;
return OK;
}
//出栈
Status Pop(SqStack &s,char &x){
if(s.top==s.base)
return ERROR;
s.top--;
x=*s.top;
return OK;
}
//获取栈顶元素
int Gettop(SqStack &s,char &c){
if(s.top==s.base)
return ERROR;
c=*(s.top-1);
return OK;
}
//若为左括号,则入栈,若遇右括号则获取栈顶元素,检查栈顶元素与当前元素是否匹配,若匹配,则栈顶元素出栈。反之,则不匹配,程序结束。
//成对的左右括号的ASCII码相差1或者2,以此结论来判断左右括号是否成对出现 哈哈哈哈有点歪门邪道的意思了吧
Status match(char a,char b){
if(a+1==b||a+2==b)//成对的左右括号的ASCII码相差1或者2
return OK;
else
return ERROR;
}
int bracketMarch(char a[]){
SqStack s;
char ch;
int i;
InitStack(s);
for(i=0;a[i]!='\0';i++){
switch(a[i]){
case '{':
case '[':
case '(':
push(s,a[i]);//遇到左括号则入栈
break;
case '}':
case ']':
case ')':
Gettop(s,ch);//遇到右括号获取栈顶元素
if(match(ch,a[i]))//检查是否匹配
Pop(s,ch);//若匹配则栈顶元素出栈
else
return ERROR;
}
}
if(s.top==s.base)
return OK;//全部匹配完
else//反之,则不匹配
return ERROR;
}
int main(){
int n;
char a[MAXSIZE];
scanf("%d",&n);
while(n--){//检查字符串数量
scanf("%s",a);
if(bracketMarch(a))
printf("Yes\n");
else
printf("No\n");
}
}