使用顺序栈实现的括号的匹配!
1.注意.h文件内容:在这里栈使用结构体实现的
zhan.h文件
#pragma once
#define MAXSIZE 100
#include<iostream>
#include<string>
#define ERROR "ERROR" //定义常量 把它们当成返回值
#define OK "OK"
#define Stackfull "Stackfull"
#define Stackempty "Stackempty"
using namespace std; //命名空间
typedef string Status; //给String类 重命名
typedef char ElemType; //给char 重命名
typedef struct {
ElemType* base;
ElemType* top;
int stacksize;
}SqStack;
以下为.cpp文件
- 顺序栈的初始化
#include"zhan.h"
Status InitStack(SqStack& S) {
//构造一个空栈
S.base = new ElemType[MAXSIZE];
if (!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = MAXSIZE;
return OK;
}
- 顺序栈的入栈
Status Push(SqStack& S, ElemType xs) {
//插入元素xs为新的栈顶元素
if (S.top - S.base == S.stacksize) return Stackfull; //栈满
*S.top++ = xs;
return OK;
}
4.顺序栈的出栈
Status Pop(SqStack& S, ElemType& xs) {
if (S.top == S.base) return Stackempty; //栈空
xs = *--S.top; //栈顶指针减1,将栈顶元素赋给xs
return OK;
}
4.1顺序栈的出栈
Status Pop1(SqStack& S) {
if (S.top == S.base) return Stackempty; //栈空
--S.top; //栈顶指针减1,将栈顶元素赋给xs
return OK;
}
5.顺序栈的取栈顶元素
ElemType GetTop(SqStack S) {
//返回S的栈顶元素,不修改栈顶指针
if (S.top != S.base) //栈非空
return *(S.top - 1); //返回栈顶元素的值,栈顶指针不变
}
6.判断栈是否为空
int IsEmpty(SqStack S) {
if (S.top == S.base) {
return 0;
}
else {
return 1;
}
}
主函数 int main
int main()
{
string t;
cout << "请输入括号字符串" << endl;
cin >> t;
SqStack s;
InitStack(s);
for (int i = 0; i < t.size(); i++) {
if (t[i] == '(' || t[i] == '[' || t[i] == '{') {
Push(s,t[i]);
cout << "入栈:" << GetTop(s) << endl;
}
else if (t[i] == ')') {
if (GetTop(s) == '(') {
cout << "匹配" << GetTop(s) << "," << t[i] << endl;
Pop1(s);
}
else {
cout << "不匹配" << endl;
break;
}
}
else if (t[i] == ']') {
if (GetTop(s) == '[') {
cout << "匹配" << GetTop(s) << "," << t[i] << endl;
Pop1(s);
}
else {
cout << "不匹配" << endl;
break;
}
}
else if (t[i] == '}') {
if (GetTop(s) == '{') {
cout << "匹配" << GetTop(s) << "," << t[i] << endl;
Pop1(s);
}
else {
cout << "不匹配" << endl;
break;
}
}
}
if (!IsEmpty(s)) {
cout << "括号字符串匹配" << endl;
}
else {
cout << "括号字符串不匹配" << endl;
}
system("pause");
return 0;
}