在代码中有其他需求可自行按备注更改,本代码是学校实验任务,参照课本及网上资料以及自己更改编写完成。
输入带括号的算术表达式,判断该表达式括号是否匹配。
代码内容:
#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; //输出匹配结果
}
实验结果: