数据结构实验---括号匹配

在代码中有其他需求可自行按备注更改,本代码是学校实验任务,参照课本及网上资料以及自己更改编写完成。

输入带括号的算术表达式,判断该表达式括号是否匹配。

代码内容:

#define _CRT_SECURE_NO_WARNINGS 1
#include "Sequential_stack.h"

SqStack S;					//定义一个栈
int e;

Status InitStack(SqStack& S)			//构建一个空栈S
{
	S.base = new SElemType[MAXSIZE];
	if (!S.base)	exit(OVERFLOW);
	S.top = S.base;
	S.Stacksize = MAXSIZE;
	return 1;
}

Status Push(SqStack& S, SElemType e)	//插入元素e为新的栈顶元素
{
	if (S.top - S.base == S.Stacksize)	return 0;
	*S.top++ = e;
	return 1;
}

Status Pop(SqStack& S, SElemType& e)	//删除S的栈顶元素,用e返回其值
{
	if (S.top == S.base)	return 0;
	e = *--S.top;
	return	1;
}

SElemType GetTop(SqStack S)				//返回S的栈顶元素,不修改栈顶指针
{
	if (S.top != S.base)
		return *(S.top - 1);
}

SElemType StackEmpty(SqStack S)			//判断是否为空栈
{
	if (S.base == S.top)
		return 1;
	else
		return 0;
}
#pragma once
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <cstdlib>

using namespace std;		//引入std命名空间中的所有成员到当前的命名空间中

#define SElemType int		//宏定义特殊的返回类型为int
#define Status int

#define MAXSIZE 100			//顺序栈存储空间的初始分配量
typedef struct
{
	SElemType* base;		//栈底指针
	SElemType* top;			//栈顶指针
	int Stacksize;			//栈可用的最大容量
}SqStack;

Status InitStack(SqStack& S);			//构建一个空栈S
Status Push(SqStack& S, SElemType e);	//插入元素e为新的栈顶元素
Status Pop(SqStack& S, SElemType& e);	//删除S的栈顶元素,用e返回其值
SElemType GetTop(SqStack S);			//返回S的栈顶元素,不修改栈顶
SElemType StackEmpty(SqStack S);		//判断是否为空栈
#define _CRT_SECURE_NO_WARNINGS 1
#include "Sequential_stack.h"

SqStack S1;					//定义一个栈
char flag;					//标志位:1表匹配正确,0表匹配错误
int x;
char ch;					//定义输入的字符

//检验表达式中所含括号是否正确匹配,如果正确匹配,返回1,否者返回0
//输入字符表达式以#结尾
Status Matching()
{
	InitStack(S1);				//初始化空栈
	flag = 1;					//标记匹配结果以控制循环及返回结果
	cin >> ch;					//读入第一个字符
	while (ch != '#' && flag)	//假设表达式以"#"结尾
	{
		switch (ch)
		{
			case '[':			//若是左括号,则将其压入栈
				Push(S1, ch);
				break;

			case '(':			//若是左括号,则将其压入栈
				Push(S1, ch);
				break;

			case ')':			//若是")",则根据当前栈顶元素的值分情况考虑
				if (!StackEmpty(S1) && GetTop(S1) == '(')
					Pop(S1, x);	//若栈非空且栈顶元素是"(",则正确匹配
				else  flag = 0;	//若栈空或栈顶元素不是"(",则错误匹配
				break;

			case ']':			//若是"]",则根据当前栈顶元素的值分情况考虑
				if (!StackEmpty(S1) && GetTop(S1) == '[')
					Pop(S1, x);	//若栈非空且栈顶元素是"[",则正确匹配
				else flag = 0;	//若栈空或栈顶元素不是"[",则错误匹配
				break;


			default:
				break;
		}
		cin >> ch;				//继续读入下一个字符
	}
	if (StackEmpty(S1) && flag)	return	1;	//匹配成功
	else  return 0;							//匹配失败
}

int main(void)
{
	if (Matching())
		cout << "匹配结果:正确" << endl;				//输出匹配结果
	else
		cout << "匹配结果:错误" << endl;				//输出匹配结果
}

实验结果:

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

慢慢丶丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值