链栈的简单实现及括号匹配问题的链栈解决方法
来源:互联网 发布:apache启动 编辑:程序博客网 时间:2024/05/17 22:19
栈是受限制的线性表,LIFO规则。
本文将使用链表的形式实现栈。
基本原理:在栈顶进行插入和删除,栈顶指针一直指着栈顶节点。
链栈的基本操作:栈的初始化,进栈,出栈,判断栈是否为空。
链栈解决的实际问题:本例是典型的括号匹配问题,功能比较粗简,但也基本能满足需求。
括号匹配问题描述:假设表达式 {[][]()}[]是正确的格式 ,{[(])} 或 ()[]}} 均为错误格式 ,只单纯的考虑括号的匹配。
问题解决思路:在判断函数中新建一个栈,对传入的字符串进行处理,如果遇到'('、'['、'{' 则取出来入栈,遇到')'、']'、'}' 则先判断栈是否为空,为空则退出,字符串出现不匹配; 栈不为空的话,判断栈顶的元素是否和当前需处理的字符括号匹配,匹配则出栈,继续判断下个字符; 如遇到非括号字符,则跳过,继续判断下一个字符。其中设置一个state状态参数,为循环的退出条件。
参考代码如下:
#include <iostream>#include <MATH.H>#include <stdlib.h>#define OK 1#define ERROR 0using 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;elsereturn 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;elsereturn ERROR;}//判断并显示void judge(char exp[]){if( OK == math(exp))cout << " 括号匹配正确 " << endl;elsecout << " 括号出现不匹配 " << 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;}
0 0
- 链栈的简单实现及括号匹配问题的链栈解决方法
- 简单的括号匹配问题
- 栈的实现-括号匹配
- 栈的C++实现及用于括号匹配
- 链栈实现括号匹配
- 括号匹配(链栈实现)
- 链栈实现括号匹配
- 括号匹配问题 栈的应用 C语言实现
- 动态栈的实现,括号匹配问题,逆波兰表达式
- 括号匹配问题--栈实现
- 基于栈的简单括号匹配
- 栈学习--简单的括号匹配
- 简单栈的应用之括号匹配
- 一个简单的括号匹配问题
- java--一道简单的括号匹配问题
- NYOJ---括号匹配问题---栈的使用
- 栈的应用2--括号匹配问题
- 栈的应用----括号匹配问题
- nginx使用eclipse调试
- Java 如何使用.dll库
- java重入锁--笔记
- SharePoint 2013 安装和配置 Project Server 2013
- 布局管理器
- 链栈的简单实现及括号匹配问题的链栈解决方法
- 系统现网环境下若检测到有系统更新,桌面设置图标右上角提示更新实施方案
- 分享一个链接
- PHP操作Memcached的各种数据方式
- PCB设计之布局规则1
- 第五周项目一 体验常成员函数
- static修饰符知多少
- Linux大文件分割split和合并cat使用方法
- 使用CFStringTransform将汉字转换为拼音