栈是受限制的线性表,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;
}