【数据结构栈应用系列】括号匹配
2016-03-26 16:59
513 查看
括号匹配算法在各种编程的IDE工具中都会用到,用来检测关于括号匹配的语法错误,括号匹配实际上不复杂,主要就是利用栈这个数据结构,扫描输入的字符串,若遇到左括号则直接入栈,若遇到右括号则弹出栈顶括号,看是否与当前括号类型相同(如同为小括号(),或同为[],注意括号应该是在英文输入法的情况下输入的),若相同则二者匹配,否则不匹配,另外,如果扫描完成,而栈中仍存在未匹配的括号,则说明不匹配,当且仅当扫描序列与栈中元素同时为空时才表示完全匹配。本博客将详细讲解括号匹配算法,为了将焦点聚焦在算法本身上,仅仅只对小括号进行检测是否匹配。
注:关于栈的另外一个典型应用就是表达式求值算法,类似于计算器效果,具体可以参看我的博客:算术表达式
注:关于栈的另外一个典型应用就是表达式求值算法,类似于计算器效果,具体可以参看我的博客:算术表达式
# include<stdio.h> # include<string.h> # include<stdlib.h> typedef struct node { char a; struct node *pnext; }node,*linklist; void inistack(linklist s) { (s)->pnext=NULL; } void push(linklist top,char c) { linklist ptemp=(linklist)malloc(sizeof(node)); (ptemp)->a=c; ptemp->pnext=(top)->pnext; (top)->pnext=ptemp; } void pop(linklist top,char* c) { linklist ptemp; ptemp=(top)->pnext; *c=(ptemp)->a; if(ptemp==NULL) printf("栈空!"); (top)->pnext=ptemp->pnext; free(ptemp); } void get(linklist top,char *x) { *x=top->pnext->a; } int isempty(linklist s) { if(s->pnext==NULL) return 1; else return 0; } int match(char x,char y) { if((x=='(')&&(y==')')) return 1; else return 0; } void Match(char x[]) { node s; int i; char ch; inistack(&s); for(i=0;x[i]!='\0';i++) { if(x[i]=='(') { push(&s,x[i]); } else if(isempty(&s)) { printf("右括号多余!\n"); return; } else { get(&s,&ch); if(match(ch,x[i])) { pop(&s,&ch); } else { printf("对应的括号不匹配!\n"); return; } } } if(isempty(&s)) printf("括号匹配!\n"); else printf("左括号多余!\n"); } void main() { int i; char x[20]; printf("请输入只含小括号的字符串\n"); scanf("%s",x); Match(x); }程序运行结果如下:
相关文章推荐
- 【数据结构栈应用系列】括号匹配
- HDU 3068 Manacher 模版题
- Redis常用数据结构及操作
- 大整数相乘(包含小数)
- 数据结构,可并堆(左偏树):COGS [APIO2012] 派遣
- Linux USB 驱动开发(二)—— USB 驱动几个重要数据结构
- 数据结构之线性表ArrayList小结(一)
- 《数据结构与算法分析C++描述》别人总结
- 二叉排序树
- python 下的数据结构与算法---5:递归(Recursion)
- 算法和数据结构学习笔记(2)——线性表
- Java中常见数据结构:list与map
- JavaScript数据结构——链表
- HDU 4286 Data Handler(splay)
- poj 3468 A Simple Problem with Integers
- bzoj 1588 营业额统计
- 《STL源码剖析》之容器
- 数据结构与算法学习(八)(续)
- 数据结构基本概念
- 设计基于锁的并发数据结构