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

来源:互联网 发布:怎么做微信淘宝优惠卷 编辑:程序博客网 时间:2024/06/07 05:31

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

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

代码如下。。

链式栈代码

//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 ){//如果与栈顶元素匹配成功则出栈 否则 返回 falseif( stack.GetTop() + 1 == data || stack.GetTop() + 2 == data ) { stack.Pop();p++;}else {return false;}}else{stack.Push( data );}}//判断栈是否为空  可以省略,能够执行到这一句说明一定为真,可以直接返回 trueif( 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;}