假设一个算术表达式中可以包含三种括号:园括号“(”和“)”、方括号“[”和“]”、花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法(已知表达式已存入数据元素为字符的顺序表中)。
2条回答 默认 最新
- CSDN专家-深度学习进阶 2021-10-03 18:04关注
#include<iostream> #include<stdlib.h> using namespace std; #define maxsize 100 int flag = 0; char useless; //定义顺序表结构 typedef struct { string s; int length; }SeqList;//不要定义成指针,否则你必须开辟空间 //定义堆栈 typedef struct { int top; char elem[maxsize]; }Stack; //初始化顺序表 void initList(SeqList& L) { L.length = 0; } //初始化堆栈 void initStack(Stack& S) { S.top = -1; } //输入创建顺序表 void createList(SeqList& L) { cin >> L.s; //L->length = sizeof(L->s)-1;sizeof函数结果包含'\0' L.length = L.s.length(); } //入栈 bool push(Stack &S,char ch) { if (S.top == maxsize - 1) { return false; } S.top++; S.elem[S.top] = ch; return true; } //出栈 bool pop(Stack &S, char &ch) { if (S.top == -1) { return false; } ch = S.elem[S.top]; S.top--; return true; } bool isEmpty(Stack S){ return S.top == -1; } char topElem(Stack S) { return S.elem[S.top]; } void matchBracket(Stack& S, char lbracket) { while (S.elem[S.top] != lbracket) { pop(S, useless); } pop(S, useless); flag--; } //检测算法 bool checkExp(SeqList L, Stack S) { int i = 0; int count = L.length; //char useless;int flag = 0; while (count--) { if (L.s[i] >= '0' && L.s[i] <= '9') {//当前是数字 i++; continue; } else {//当前是符号,包括运算符、左括号和右括号 if (L.s[i] == '(' || L.s[i] == '[' || L.s[i] == '{') { push(S, L.s[i]); flag++; } else if(L.s[i] =='+' || L.s[i]=='-' || L.s[i] == '*' || L.s[i] == '/'){ char top = topElem(S); if (top == '+' || top == '-' || top == '*' || top == '/') {//if(top == '(' || ....) pop(S, useless); } else { push(S, L.s[i]); } } else if(L.s[i] == ')' || L.s[i] == ']' || L.s[i] == '}'){//当前是右括号 if (flag > 0) { if (L.s[i] == ')') { matchBracket(S, '('); } else if (L.s[i] == ']') { matchBracket(S, '['); } else { matchBracket(S, '{'); } } else { return false; } } else { cout << "输入的字符有误" << endl; return false; } } i++; } if (isEmpty(S)) { return true; } else { char top = topElem(S); if (top == '+' || top == '-' || top == '*' || top == '/') { return true; } else {//栈顶是左括号 return false; } } } //[5+(6-3)]-(2+3)] //flag记录栈内含有左括号的个数,当flag为0但当前扫描到的字符为右括号,则匹配错误 int main() { SeqList l; Stack s; initList(l); initStack(s); createList(l); if (checkExp(l, s)) { cout << "yes" << endl; } else { cout << "no" << endl; } }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 2无用 3
悬赏问题
- ¥15 基于双目测规则物体尺寸
- ¥15 wegame打不开英雄联盟
- ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
- ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
- ¥30 eclipse开启服务后,网页无法打开
- ¥30 雷达辐射源信号参考模型
- ¥15 html+css+js如何实现这样子的效果?
- ¥15 STM32单片机自主设计
- ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
- ¥15 不小心不正规的开发公司导致不给我们y码,