数据结构c++实现----[栈的应用]括号配对

我的教材是严蔚敏的那本,所以把上面的一些算法算在数据结构里一起写了

栈 用的是 上一次写的链式栈。。。

代码如下。。

链式栈代码

//head.h

#ifndef HEAD
#define HEAD

#include<iostream>

using namespace std;

template<typename T> class LinkStack;



template <typename T>
class LinkNode
{
	public:
		friend class LinkStack<T>;
		LinkNode();
		LinkNode( const T &elem);
		//~LinkNode();用不到
    private:
		T data;
		LinkNode<T> *pPre;
		LinkNode<T> *pNext;
};

template <typename T>
LinkNode<T>::LinkNode():pPre(NULL),pNext(NULL)
{
	//用于初始化头结点,data用不到。
}
template <typename T>
LinkNode<T>::LinkNode( const T &elem):data(elem),pPre(NULL),pNext(NULL)
{
	//初始化其余元素
}


#endif

//linkstack.cpp

#include "head.h"


template<typename T> 
class LinkStack
{
	public:
		LinkStack();
		~LinkStack();
		bool IsEmpty();
		void Push(const T &data);
		T Pop();
		T GetTop();
		int GetSize();
		void Clear();
		
	private:
		LinkNode<T> *Top;
		LinkNode<T> *Base;
		int Size;
};

template<typename T> 
LinkStack<T>::LinkStack():Size( 0 )
{
	Top = new LinkNode<T>;
	Base = Top;
}
template<typename T> 
LinkStack<T>::~LinkStack()
{
	if( ! IsEmpty() ){
		Clear();
	}
	delete Base;
}

template<typename T> 
bool LinkStack<T>::IsEmpty()
{
	if( Size == 0 ){
		return true;
	}else{
		return false;
	}
}

template<typename T> 
int LinkStack<T>::GetSize()
{
	return Size;
}

template<typename T> 
T LinkStack<T>::GetTop()
{
	return Top->data;
}

template<typename T> 
void LinkStack<T>::Push( const T &data)
{
	LinkNode<T> *p;
	p = new LinkNode<T>;
	p->pPre = Top;
	p->data = data;
	Top = p;

	++Size;

}

template<typename T> 
T LinkStack<T>::Pop()
{
	LinkNode<T> *q;
	q = Top;
	T data;
	Top = q->pPre;
	data = q->data;
	delete q;
	--Size;
	return data;
}

template<typename T> 
void LinkStack<T>::Clear()
{	LinkNode<T> *p;
	while( Top != Base ){
		p = Top;
		Top = p->pPre;
		delete p;

		--Size;
	}
}



括号配对代码

//backetpair.cpp

#include "head.h"
#include "lstack.cpp"

// 没有对 传入字符串是否合法进行判断

bool bracketpair( char *p ){
	char data;
	LinkStack<char> stack;
	
	//对第一个元素进行判断 如果是右括号 返回 false
	//左括号 压栈 
	data = *p;
	if( data == 41 || data == 93 || data == 125 ){
		return false;
	}else{
		stack.Push( data );
		++p;
	}

	while( *p != '\0' ){
		data = *p;
		//判断,如果是左括号直接入栈 右括号匹配栈顶
		if( data == 41 || data == 93 || data == 125 ){

			//如果与栈顶元素匹配成功则出栈 否则 返回 false
			if( stack.GetTop() + 1 == data || stack.GetTop() + 2 == data ) { 
				stack.Pop();
				p++;
			}else {
				return false;
			}
		}else{
			stack.Push( data );
		}
	}

	//判断栈是否为空  可以省略,能够执行到这一句说明一定为真,可以直接返回 true
	if( stack.IsEmpty() ){
		return true;
	}else{
		return false;
	}

}

//main.cpp

#include "head.h"
//#include "bracketpair.cpp"
extern bool bracketpair( char *p );    //加extern关键字防止重复定义

int main()
{
	char str[100];

	cin>>str;

	if( bracketpair( str ) ){
		cout<< "ok!"<<endl;
	}
	else{
		cout<<"error!"<<endl;
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值