括号匹配的检验(栈)

#include<iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW 2
typedef int Status;
typedef char SElemType;
//栈的顺序存储表示
#define STACK_INIT_SIZE 10   //存储空间初始分配量
#define STACKINCREMENT 2     //存储空间分配增量
struct SqStack
{
	SElemType* base;//在栈构造之前和销毁之后,base的值为NULL
	SElemType* top;//栈顶指针
	int stacksize;//当前已分配的存储空间,以元素为单位
};//顺序栈

Status InitStack(SqStack& S);//构建一个空表
Status StackEmpty(SqStack S);//若栈S为空栈,返回TURE,否则返回FALSE
Status Push(SqStack& S, SElemType e);//插入元素e为新的栈顶元素
Status Pop(SqStack& S, SElemType& e);//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR

void check()//**括号匹配检查**
{//对于输入的任意一个字符串,检验括号是否匹配成功
	SqStack s;
	SElemType ch[80], * p, e;
	if (InitStack(s))//初始化成功
	{
		printf("请输入表达式");
		gets_s(ch);
		p = ch;
		while (*p)
		{
			switch (*p)
			{
			case'(':
			case'[':Push(s, *p++);
				break;//左括号入栈,且p++
			case')':
			case']':if (!StackEmpty(s))//栈不空
			{
				Pop(s, e);//弹出栈顶元素
				if (*p == '(' && e != ')' || *p == '[' && e != ']')//弹出的栈顶元素与*p不配对
				{
					printf("左右括号不配对\n");
					exit(ERROR);
				}
				else
				{
					p++; break;//跳出switch
				}
			}
				   else //栈空
			{
				printf("缺乏左括号");
				exit(ERROR);
			}
			default:p++;//其他字符不处理,指针后移
			}
		}
	}
	if (StackEmpty(s))//字符串结束时栈空
		printf("括号匹配\n");
	else
		printf("括号不匹配\n");
}
int main()
{
	check();
	return 0;
}
Status InitStack(SqStack& S)//构建一个空表
{
	if (!(S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType))))
		exit(OVERFLOW);//存储分配失败
	S.top = S.base;
	S.stacksize = STACK_INIT_SIZE;
	return OK;
}
Status StackEmpty(SqStack S)//若栈S为空栈,返回TURE,否则返回FALSE
{
	if (S.top == S.base)
		return TURE;
	else
		return FALSE;
}
Status Push(SqStack& S, SElemType e)//插入元素e为新的栈顶元素
{
	if (S.top - S.base >= S.stacksize)//栈满,追加存储空间
	{
		S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
		if (!S.base)
			exit(OVERFLOW);//存储分配失败
		S.top = S.base + S.stacksize;
		S.stacksize += STACKINCREMENT;
	}
	*(S.top)++ = e;
	return OK;
}

Status Pop(SqStack& S, SElemType& e)//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
		{
		if (S.top == S.base)
			return ERROR;
		e = *--S.top;
		return OK;
		}

调试结果如下
在这里插入图片描述
因为代码中用到了引用,所以需要用c++编译器,我用的是vs2019,有些函数可能和别的编译器长得不一样比如gets_s()

  • 7
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二零二三.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值