链栈的简单实现及括号匹配问题的链栈解决方法

来源:互联网 发布: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
原创粉丝点击