数据结构(18)栈典型问题之C++实现括号匹配
来源:互联网 发布:阿里云万网域名注册 编辑:程序博客网 时间:2024/05/17 02:24
- 导言
- 括号匹配
- 实现
- 运行结果
导言
假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,即【{}】或【([][])】等为正确的格式【[(])】或【[())】等均为不正确的格式。
括号匹配
思路:
左括号入栈,在未遇到右括号前,一直入栈,一旦遇到匹配的右括号,就一直弹出栈顶元素,直到栈空,若栈空,左括号与右括号已匹配完全,则完全匹配,反之则反。
实现
/* 函数结果状态代码 */#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef char SElemType; // 定义栈元素类型为整型typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 *///相关头文件包含#include <iostream>using namespace std;/*栈的顺序存储表示 */#define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */#define STACKINCREMENT 2 /* 存储空间分配增量 */typedef struct SqStack{ SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */ SElemType *top; /* 栈顶指针 */ int stacksize; /* 当前已分配的存储空间,以元素为单位 */}SqStack; /* 顺序栈 *//* -------- 顺序栈基本函数实现 -------------------*/Status InitStack(SqStack *S){ /* 构造一个空栈S */ (*S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if (!(*S).base) exit(OVERFLOW); /* 存储分配失败 */ (*S).top = (*S).base; (*S).stacksize = STACK_INIT_SIZE; return OK;}Status DestroyStack(SqStack *S){ /* 销毁栈S,S不再存在 */ free((*S).base); (*S).base = NULL; (*S).top = NULL; (*S).stacksize = 0; return OK;}Status ClearStack(SqStack *S){ /* 把S置为空栈 */ (*S).top = (*S).base; return OK;}Status StackEmpty(SqStack S){ /* 若栈S为空栈,则返回TRUE,否则返回FALSE */ if (S.top == S.base) return TRUE; else return FALSE;}int StackLength(SqStack S){ /* 返回S的元素个数,即栈的长度 */ return S.top - S.base;}Status GetTop(SqStack S, SElemType &e){ if (S.top == S.base)return ERROR; e = *(S.top - 1); return OK;}//GetTopStatus 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;}//pushStatus Pop(SqStack &S, SElemType &e){//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR if (S.top == S.base)return ERROR; e = *--S.top; return OK;}//popStatus StackTraverse(SqStack S, Status(*visit)(SElemType)){ /* 从栈底到栈顶依次对栈中每个元素调用函数visit()。 */ /* 一旦visit()失败,则操作失败 */ while (S.top>S.base) visit(*S.base++); cout << "\n"; return OK;}void visit(SElemType e){ cout << e;}void check(){// 对于输入的任意一个字符串,检验括号是否配对 SqStack sq; SElemType ch[100], *p, e; InitStack(&sq); // 初始化栈成功 cout << "请输入带括号(()、[]和{})的表达式:\n"; cin.getline(ch, 101, '\n'); p = ch;//p指向第一个 while (*p != '\0')//没到表尾 { switch (*p) { case '(': case '[': case '{': Push(sq, *p++); // 左括号入栈,且p++,p指向下一个元素 break; case ')': case ']': case '}': if (!StackEmpty(sq))//如果栈不为空 { Pop(sq, e); // 弹出栈顶元素 if (!(e == '('&&*p == ')' || e == '['&&*p == ']' || e == '{ '&&*p == ' }')) { // 出现3种匹配情况之外的情况 cout << "左右括号不匹配" << endl; system("pause"); exit(ERROR); } }else // 栈空 { cout << "缺乏匹配的左括号" << endl; system("pause"); exit(ERROR); } default: p++;//只把括号字符压栈,其他字符不压栈 break; } } if (StackEmpty(sq)) // 字符串结束时栈空 cout << "括号完全匹配" << endl; else cout << "缺乏右括号" << endl;}int main(){ //本程序说明,是在VS2013中运行的,若是其他地方无法运行,建议修改代码 //程序声明 cout << "***************************************************************************" << endl; cout << " 《数据结构》<C语言版本>严蔚敏 吴伟名 编著 " << endl; cout << " 编写年月2016年3月 " << endl; cout << " 编写者:YuYunTan " << endl; cout << " 括号匹配 " << endl; cout << "***************************************************************************" << endl; check(); system("pause"); return 0;}
运行结果
1 0
- 数据结构(18)栈典型问题之C++实现括号匹配
- 数据结构之---C语言实现括号匹配(栈实现)
- c++,数据结构之括号匹配问题
- (C++)数据结构之括号匹配的问题?
- 数据结构之栈之括号匹配问题
- 数据结构(C语言)读书笔记6:栈的应用之括号匹配的C代码实现
- 数据结构-----栈实现括号匹配问题
- 数据结构作业 栈 实现 括号匹配 问题
- 数据结构 括号匹配问题 (栈 C语言)
- 数据结构之括号匹配问题
- 数据结构实验之栈四:括号匹配(java实现)
- C/C++数据结构通过顺序栈实现括号()匹配算法
- C数据结构学习历程(4) 链栈之 括号匹配
- 数据结构C语言版之括号匹配
- 数据结构之栈的应用:括号匹配问题
- C实例---括号匹配(栈实现)
- 数据结构栈之括号匹配(STL实现&&数组栈实现)
- 数据结构之括号匹配
- C++的顶层const和底层const的理解
- 扫描二维码自动识别手机APP下载地址
- 扒扒数据库长长知识(下载资源组合看day2)之 07 (课堂练习)
- 飛飛(六)就拿胖子说事:成年男性的标准体重公式为:标准体重(kg)=身高(cm)-100,超标准20%为超重,比标准体重轻20%为超清。输出标准体重,当超重时给出提示
- 硬盘分区和系统启动
- 数据结构(18)栈典型问题之C++实现括号匹配
- 浅谈 MVP in Android
- 关于Android的.so文件你所需要知道的
- IM 即时通讯 instant messageing
- Array.prototype.slice应用和原理探析
- Error:Execution failed for task ':app:transformClassesWithDexForDebug'. com.android.build.transform.
- 大型网站Mysql的演变史
- ajax获取新闻数据的小例子
- 求和(数学公式推导、取余运算)