我的教材是严蔚敏的那本,所以把上面的一些算法算在数据结构里一起写了
栈 用的是 上一次写的链式栈。。。
代码如下。。
链式栈代码
//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;
}