学习日记栈(1)括号匹配

括号匹配 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");
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值