您的位置:首页 > 理论基础 > 数据结构算法

用C++链式栈解决数据结构中的括号匹配问题。

2010-10-22 13:18 471 查看
相信学过数据结构的都晓得这个经典问题:括号匹配吧。废话不多少了,看代码吧

LinkStack.h

#include<stdio.h>
template<class T> class LinkStackNode
{
	public:
	T data;
	LinkStackNode<T> *link;
	LinkStackNode(T& value):link(NULL),data(value){}
};
template<class T> class LinkStack
{
	LinkStackNode<T> *tos;
	public:
		LinkStack():tos(NULL){}
		void push(T& value);
		T pop();
		T& GetTop();
		bool IsEmpty();
		void MakeEmpty();
};
template<class T>
void LinkStack<T>::push(T& value)
{
	LinkStackNode<T>* add=new LinkStackNode<T>(value);
	add->link=tos;
	tos=add;
}
template<class T>
T LinkStack<T>::pop()
{
	//assert(tos!=NULL);
	LinkStackNode<T>* old=tos;
	tos=tos->link;
	T data=old->data;
	delete old;
	return data;
}
template<class T>
T& LinkStack<T>::GetTop()
{
	return tos->data;
}
template<class T>
bool LinkStack<T>::IsEmpty()
{
	return tos==NULL;
}
template<class T>
void LinkStack<T>::MakeEmpty()
{
	//while(tos!= NULL)
	//	pop();
	while(!this->IsEmpty())
	{
		this->pop();
	}
}


主函数如下:

#include<iostream>
#include<stdio.h>
#include<assert.h>
#include "LinkStack.h"
using namespace std;
int main()
{
	cout<<"输入括号序列(以0结束):";
	LinkStack<char> small;
	char a;
	do
	{
		cin>>a;
		switch(a)
		{
		case '(':
			small.push(a);
			break;
		case ')':
			if(!small.IsEmpty())
			{
				small.pop();
				break;
			}
			if(small.IsEmpty())
			{
				cout<<"Wrong!"<<endl;
				exit(0);
				break;
			}

		}

	}while(a!='0');
		if(small.IsEmpty())
		{
			cout<<"OK!"<<endl;
		}
		else
			cout<<"Wrong!"<<endl;
		return 0;

}


比较简单的实现了一下,主要是链式栈的模板类的实现,这个有些重要。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: