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

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

 

    原文作者:括号匹配问题
    原文地址: https://blog.csdn.net/zuiailongkui_yanghl/article/details/44859131
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞