链栈的简单实现及括号匹配问题的链栈解决方法
2015-04-03 20:39
429 查看
栈是受限制的线性表,LIFO规则。
本文将使用链表的形式实现栈。
基本原理:在栈顶进行插入和删除,栈顶指针一直指着栈顶节点。
链栈的基本操作:栈的初始化,进栈,出栈,判断栈是否为空。
链栈解决的实际问题:本例是典型的括号匹配问题,功能比较粗简,但也基本能满足需求。
括号匹配问题描述:假设表达式 {[][]()}[]是正确的格式 ,{[(])} 或 ()[]}} 均为错误格式 ,只单纯的考虑括号的匹配。
问题解决思路:在判断函数中新建一个栈,对传入的字符串进行处理,如果遇到'('、'['、'{' 则取出来入栈,遇到')'、']'、'}' 则先判断栈是否为空,为空则退出,字符串出现不匹配; 栈不为空的话,判断栈顶的元素是否和当前需处理的字符括号匹配,匹配则出栈,继续判断下个字符; 如遇到非括号字符,则跳过,继续判断下一个字符。其中设置一个state状态参数,为循环的退出条件。
参考代码如下:
本文将使用链表的形式实现栈。
基本原理:在栈顶进行插入和删除,栈顶指针一直指着栈顶节点。
链栈的基本操作:栈的初始化,进栈,出栈,判断栈是否为空。
链栈解决的实际问题:本例是典型的括号匹配问题,功能比较粗简,但也基本能满足需求。
括号匹配问题描述:假设表达式 {[][]()}[]是正确的格式 ,{[(])} 或 ()[]}} 均为错误格式 ,只单纯的考虑括号的匹配。
问题解决思路:在判断函数中新建一个栈,对传入的字符串进行处理,如果遇到'('、'['、'{' 则取出来入栈,遇到')'、']'、'}' 则先判断栈是否为空,为空则退出,字符串出现不匹配; 栈不为空的话,判断栈顶的元素是否和当前需处理的字符括号匹配,匹配则出栈,继续判断下个字符; 如遇到非括号字符,则跳过,继续判断下一个字符。其中设置一个state状态参数,为循环的退出条件。
参考代码如下:
#include <iostream> #include <MATH.H> #include <stdlib.h> #define OK 1 #define ERROR 0 using namespace std; typedef struct node { int data; struct node * p_next; }node,*stackpt; stackpt p_top; void InitialStack(stackpt & top) { top = NULL; } int StackEmpty(stackpt top) { if(top == NULL) return OK; else return ERROR; } //入栈 int push(stackpt & top, int x) { node * p = new node; if(p == NULL) exit(OVERFLOW); p->data = x; p->p_next = top; top = p; return OK; } //出栈 int pop(stackpt & top, int &x) { node * p; if(top == NULL) return ERROR; x = top->data; p = top; top = top->p_next; delete p; return OK; } int pop_char(stackpt & top, char &x) { node * p; if(top == NULL) return ERROR; x = top->data; p = top; top = top->p_next; delete p; return OK; } //显示 void showStack(stackpt top) { node * p = top; while(p != NULL) { cout << p->data << " "; p = p->p_next; } cout << endl; } //括号匹配的检测 [([][{}])] 期待的急迫程度 int math(char exp[]) { int state = 1 , i = 0; char e; stackpt stack; InitialStack(stack); cout << " 字符串长度:"<< strlen(exp) << endl; while(i<strlen(exp) && state) { switch(exp[i]) { case '(': case '[': case '{': push(stack,exp[i]); i++; break; case ')': case ']': case '}': if(StackEmpty(stack)) return ERROR; else { switch(exp[i]) { case ')': if(stack->data != '(') { state = 0; cout << " 第 "<< i << " 个字符 :" << "\""<< exp[i-1] << "\"" << "最先不匹配 !" << endl; } else { pop_char(stack,e); i++; } break; case ']': if(stack->data != '[') { state = 0; cout << " 第 "<< i << " 个字符 :" << "\""<< exp[i-1] << "\"" << "最先不匹配 !" << endl; } else { pop_char(stack,e); i++; } break; case '}': if(stack->data != '{') { state = 0; cout << " 第 "<< i << " 个字符 :" << "\""<< exp[i-1] << "\"" << "最先不匹配 !" << endl; } else { pop_char(stack,e); i++; } break; } } default: i++; continue; } } if(StackEmpty(stack) && state) return OK; else return ERROR; } //判断并显示 void judge(char exp[]) { if( OK == math(exp)) cout << " 括号匹配正确 " << endl; else cout << " 括号出现不匹配 " << endl; } int main() { cout << "- - - - - - - - - 链栈测试 - - - - - - - - " << endl; InitialStack(p_top); push(p_top,1); push(p_top,2); push(p_top,3); push(p_top,4); push(p_top,5); push(p_top,6); push(p_top,7); push(p_top,8); push(p_top,9); push(p_top,10); showStack(p_top); cout << "- - - - - - - 括号匹配的测试 - - - - - - " << endl; char a[20] = "({+}3[](2{)1))2-1"; judge(a); return 0; }
相关文章推荐
- JS简单实现括号匹配问题
- Python实现求解括号匹配问题的方法
- JS简单实现括号匹配问题
- java字符串星号、问号匹配问题解决方法
- 解决下载文件名乱码问题的简单方法
- 四舍五入问题,超简单解决方法
- 异步 HttpContext.Current实现取值的方法(解决异步Application,Session,Cache...等失效的问题)
- 一个简单行列转化问题的简单解决方法。
- java字符串星号、问号匹配问题解决方法
- jbuilder光标问题解决的最简单方法 [小糊涂的灵感]
- firefox无法输入中文问题解决方法 - 简单有效
- 不在乎用的实现方法正不正宗,能解决我的问题就OK
- 异步 HttpContext.Current实现取值的方法(解决异步Application,Session,Cache...等失效的问题)
- 简单实现AJAX: ASP.NET2.0 中回调的实现及常见问题的解决
- vb.Net中http+ssl问题的超级简单解决方法
- 安全字符串 SecureString 的设计与实现 [1] 现有问题与解决方法
- 导出Excel的简单方法,并可以解决乱码问题
- 括号匹配问题 栈的应用 C语言实现
- UrlReWriter 实现方法 续_解决FROM action 跳转问题
- Visual Studio.net 2003安装提示重启问题简单解决方法