括号匹配及其变形
来源:互联网 发布:c语言怎么实现多线程 编辑:程序博客网 时间:2024/06/06 03:15
给你一些括号,问它们是否可以完全匹配
- 遍历输入字符串
- 遇到左括号(,{,[<,将该字符入栈,遇到右括号)}]>,返回栈顶元素,如果该元素与栈顶元素相匹配,则将栈顶元素出栈,继续循环,否则退出循环。
#include <cstdio>#define maxSize 10000typedef struct sta{ char elem[maxSize]; int top; }SeqStack;void InitStack(SeqStack&s){ s.top=-1;}void Push(SeqStack&s,char x){ s.elem[++s.top]=x;}void Pop(SeqStack&s){ s.top--;}int GetTop(SeqStack&s,char &x){ if (s.top==-1) { return 0; /* code */ } x=s.elem[s.top]; return 1;}int Empty(SeqStack&s){ return s.top==-1;}int getResult(char st[],SeqStack&s){ int i=0; while(st[i]!='\0') { if (st[i]=='('||st[i]=='['||st[i]=='{'||st[i]=='<') { Push(s,st[i]); /* code */ } else if(st[i]==')'||st[i]==']'||st[i]=='}'||st[i]=='>') { char ch; int flag=GetTop(s,ch); if(flag){ if((ch=='('&&st[i]==')')||(ch=='['&&st[i]==']')||(ch=='{'&&st[i]=='}')||(ch=='<'&&st[i]=='>')) { Pop(s); } else return 0; } else{ return 0; } /* code */ } i++; } if(Empty(s)) return 1; return 0;}char str[105];int main(int argc, char const *argv[]){ while(~scanf("%s",str)) { SeqStack s; InitStack(s); int signal=getResult(str,s); if (signal) { printf("Yes\n"); } else{ printf("No\n"); } } return 0;}
https://biancheng.love/problem/725/index
写在表达式里常用的括号共有3种:大括号”{ }”,中括号”[ ]”,小括号“( )”,而且小括号里面不能够有其他括号,中括号里面只能有小括号,只有大括号可以包含大括号。不过mdd总是忘记这些规则,你能够帮助他判断这些表达式是否正确吗?
- 遍历输入的字符串
- 如果是左括号即入栈
- 如果是右括号,则需根据题意进行比较返回当前栈顶元素和栈顶向下第二个元素。然后根据匹配规则进行相应的出栈或者退出循环操作,具体见代码注释
#include <cstdio>#define maxSize 10000typedef struct sta{ char elem[maxSize]; int top; }SeqStack;void InitStack(SeqStack&s){ s.top=-1;}void Push(SeqStack&s,char x){ s.elem[++s.top]=x;}void Pop(SeqStack&s){ s.top--;}int GetTop(SeqStack&s,char &x){ if (s.top==-1) { return 0; /* code */ } x=s.elem[s.top]; return 1;}int GetSecondTop(SeqStack&s,char &x){ if (s.top-1==-1) { return 0; /* code */ } x=s.elem[s.top-1]; return 1;}int Empty(SeqStack&s){ return s.top==-1;}int getResult(char st[],SeqStack&s){ int i=0; while(st[i]!='\0') { if (st[i]=='('||st[i]=='['||st[i]=='{') { Push(s,st[i]); /* code */ } else if(st[i]==')'||st[i]==']'||st[i]=='}') { char ch,ch1; int flag=GetTop(s,ch);//flag为是否有栈顶元素 int flag1=GetSecondTop(s,ch1);//flag1为是否有次级栈顶元素 if(flag==1&&flag1==0)//如果无次级栈顶元素,则按照普通的匹配规则进行匹配 { if((ch=='('&&st[i]==')')||(ch=='['&&st[i]==']')||(ch=='{'&&st[i]=='}')) { Pop(s); } else return 0; } else if(flag==1&&flag1==1){//如果有次级栈顶元素 if((ch=='('&&ch1!='('&&ch1!='{'&&st[i]==')'))//如果栈顶是(,则不允许次级栈顶元素为(和{ Pop(s); else if((ch=='['&&ch1!='['&&ch1!='('&&st[i]==']'))//如果栈顶为[,则不允许次级站定元素为[和( Pop(s); else if((ch=='{'&&ch1!='('&&ch1!='['&&st[i]=='}')){//如果栈顶为{,则不允许次级栈顶元素为(和[ Pop(s); } else return 0; } else{ return 0; } /* code */ } i++; } if(Empty(s)) return 1; return 0;}char str[105];int main(int argc, char const *argv[]){ while(~scanf("%s",str)) { SeqStack s; InitStack(s); int signal=getResult(str,s); if (signal) { printf("Yes\n"); } else{ printf("No\n"); } } return 0;}
0 0
- 括号匹配及其变形
- 关于括号匹配的问题及其源码
- zoj1016 Parencodings(括号匹配变形:STL栈处理+模拟)
- 括号括号括号匹配
- 第三章:顺序栈及其应用之二---括号匹配
- 括号匹配
- 括号匹配
- 括号匹配
- 括号匹配
- 括号匹配/()[]
- 括号匹配
- 括号匹配
- 括号匹配
- 括号匹配
- 括号匹配!!!!
- 括号匹配
- 括号匹配
- 括号匹配
- Maven构建Spark Framework Java项目--Linux命令行
- matlab形态学处理命令
- android 自定义TextView,内容指定位置滚动动画效果
- c 陷阱与缺陷读书笔记
- 1053. 住房空置率 (20)
- 括号匹配及其变形
- mongodb3.0+导出库导入库
- NOIP 2004 提高组 复赛 chorus 合唱队形
- ReactNative系列之十三WebStorm的JSX语法配置及自动补全设置
- 330. Patching Array(Hard)
- 51Nod 1005 大数加法
- 排列组合_排列_数学公式
- Latex学习过程
- 不借助中间变量交换两个数