您的位置:首页 > 其它

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

2015-04-03 20:39 429 查看
栈是受限制的线性表,LIFO规则。

本文将使用链表的形式实现栈。

基本原理:在栈顶进行插入和删除,栈顶指针一直指着栈顶节点。

链栈的基本操作:栈的初始化,进栈,出栈,判断栈是否为空。

链栈解决的实际问题:本例是典型的括号匹配问题,功能比较粗简,但也基本能满足需求。

括号匹配问题描述:假设表达式  {[][]()}[]是正确的格式 ,{[(])} 或 ()[]}} 均为错误格式 ,只单纯的考虑括号的匹配。

问题解决思路:在判断函数中新建一个栈,对传入的字符串进行处理,如果遇到'('、'['、'{' 则取出来入栈,遇到')'、']'、'}' 则先判断栈是否为空,为空则退出,字符串出现不匹配; 栈不为空的话,判断栈顶的元素是否和当前需处理的字符括号匹配,匹配则出栈,继续判断下个字符; 如遇到非括号字符,则跳过,继续判断下一个字符。其中设置一个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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表