原理
主要是利用了栈的先进后出的原理,我们从左到右依次扫描需要判断的字符串,遇见“(”,“{”,“[”就入栈,遇见“)”,“]”,“]”就出栈。若三种左括号没有全部入栈便碰到了右括号那显然不匹配。碰到左括号进栈,碰到与其相匹配的右括号时出栈,当字符串扫描到‘\0’,并且此时栈为空则括号匹配,否则不匹配。
其中使用了stdio.h的库函数gets():输入一串字符串
代码如下:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<stdlib.h>
using namespace std;
#define MaxSize 128//最大空间
typedef int ElemType;
typedef struct _SqStack {
ElemType* base;//栈底指针
ElemType* top;//栈顶指针
}SqStack;
//栈的初始化
bool InitStack(SqStack& S) {//构建一个空栈S,S是引用,就是别名
S.base = new ElemType[MaxSize];//为顺序栈分配一个最大容量是MaxSize的空间
if (!S.base)
return false;
S.top = S.base;//top初始化为base,空栈
return true;
}
//入栈操作
bool putStack(SqStack& S, int e) {
if ((S.top - S.base) == MaxSize)
return false;
*(S.top++) = e;
//将元素压入栈顶,栈顶指针加一
return true;
}
//出栈操作
bool PopStack(SqStack& S, int* e) {//删除栈顶元素,暂存在e里面
if (S.base == S.top)//栈空
return false;
e = --S.top;
return true;
}
//获取栈顶元素
/*int GetTop(SqStack& S, int* e) {//删除栈顶元素,暂存在e里面
if (S.base == S.top)//栈空
return -1;
*e = *(--S.top);
return 1;
}*/
int GetTop(SqStack& S, int& e) {//取出栈顶元素,栈顶指针不变
if (S.base == S.top) {//栈空
return 0;
}
else {
e = *(S.top - 1);
return 1;
}
}
//判断栈是否为空5
bool IsEmpty(SqStack& S) {
if (S.top == S.base) {
return true;
}
else {
return false;
}
}
//销毁栈
void DestoryStack(SqStack& S) {//销毁栈
if (S.base) {
free(S.base);
S.base = NULL;
S.top = NULL;
}
}
int same(ElemType e, ElemType ch) {
if (e == '(' && ch == ')')
return 1;
else if (e == '[' && ch == ']')
return 1;
else if (e == '{' && ch == '}')
return 1;
else
return 0;
}
void main() {
int i, o,e;
SqStack S;
InitStack(S);
char* p;
cout << "请输入算数表达式:";
char str[120];//定义一个字符串数组
gets_s(str);
p = str;
while (*p) {
switch (*p) {
case'(':
case'{':
case'[':
putStack(S, *p++);
break;
case')':
case'}':
case']':
if (IsEmpty(S)) {
cout << "缺少左括号!" << endl;
return;
}
else {
GetTop(S,e);//栈顶元素
if (same(e, *p))
PopStack(S, &e);
else {
cout << "括号不匹配";
return ;
}
}
default:
p++;
}
}
if (IsEmpty(S)) {
cout << "括号匹配" << endl;
}
else {
cout << "括号不匹配" << endl;
}
}
数据结构要动手画啊啊啊啊啊啊啊啊啊