c++ 链式栈

来源:互联网 发布:深信服上网行为js 编辑:程序博客网 时间:2024/05/23 20:35
链式栈:

文件名:LinkedStack.h

#include
#include
using namespace std;
#include "static.h"

template
struct LinkNode{
       T data;
       LinkNode* link;
       LinkNode(LinkNode* ptr = NULL){
              link = ptr;
       }
       LinkNode(const T& item, LinkNode* ptr =NULL){
              data = item;
              link = ptr;
       }
};


template
class LinkedStack;

template
std::ostream&operator<<(std::ostream& os, LinkedStack&s);

template
class LinkedStack:public Stack{
public:
       LinkedStack():top(NULL){};
       ~LinkedStack(){makeEmpty();};
       void Push(const T& x);
       bool Pop(T& x);
       bool getTop(T& x) const;
       bool IsFull(){};
       bool IsEmpty() const{
              return (top == NULL) ? true :false;
       }
       int getSize() const;
       void makeEmpty();
       friend std::ostream&operator<< (std::ostream& os, LinkedStack&s);
private:
       LinkNode* top;
};

template
void LinkedStack::makeEmpty(){
       LinkNode* del;
       while(top != NULL){
              del = top;
              top = top->link;
              delete del;
       }
}

template
void LinkedStack::Push(const T& x){
       top = new LinkNode(x, top);
       assert(top != NULL);
}

template
bool LinkedStack::Pop(T& x){
       if(IsEmpty() == true) return false;
       LinkNode *p = top;
       x = top->data;
       top = top->link;
      delete p;
       return true;
}

template
bool LinkedStack::getTop(T& x)const{
       if(IsEmpty() == true) return false;
       x = top->data;
       return true;
}

template
int LinkedStack::getSize()const{
       LinkNode* p = top;
       int k = 0;
       while(p != NULL){
              p = p->link;
              k++;
       }
       return k;
}

template
std::ostream&operator<<(std::ostream& os, LinkedStack&s){
       os<<"栈中元素的个数 ="<<s.getSize()<<endl;
       LinkNode* p = s.top;
       int i = 0;
       while(p != NULL){
             os<<++i<<":"<<p->data<<endl;
              p = p->link;
       }
       return os;
}


文件名:static.h
const int maxSize = 50;
template
class Stack{
public:
       Stack(){};
       virtual void Push(const T& x) = 0;
       virtual bool Pop(T& x) = 0;
       virtual bool getTop(T& x) const = 0;
       virtual bool IsEmpty() const = 0;
       virtual bool IsFull() const = 0;
       virtual int getSize() const = 0;
};


文件名:main.cpp
#include "LinkedStack.h"

void menu(){
       cout<<"1:进栈\t";
       cout<<"2:退栈\t";
       cout<<"3:栈顶元素\t";
       cout<<"4:是否为空\t";
       cout<<"5:栈中元素个数\t";
       cout<<"6:清空栈中内容\t";
       cout<<"7:输出\n\r";
}

int main(){
       int x;
       LinkedStack linkedstack;
       menu();
       cin>>x;
       while(1){
              switch(x){
                     case1:
                           cout<<"请输入进栈的值:";
                           cin>>x;
                           linkedstack.Push(x);
                           break;
                     case2:
                           linkedstack.Pop(x);
                          cout<<"退栈的数值为:"<<x<<endl;
                           break;
                     case3:
                           if(linkedstack.getTop(x)){
                                 cout<<"栈顶元素为:"<<x<<endl;
                           }
                           else{
                                 cout<<"为空栈"<<endl;
                           }
                           break;
                     case4:
                           if(linkedstack.IsEmpty()){
                                 cout<<"为空"<<endl;
                           }
                           else{
                                 cout<<"不为空"<<endl;
                           }
                           break;
                     case5:
                          cout<<"栈中的数目为:"<<linkedstack.getSize()<<endl;
                           break;
                     case6:
                           linkedstack.makeEmpty();
                           break;
                     case7:
                           cout<<linkedstack;
                           break;
                    default:
                           break;
              }
              menu();
              cin>>x;
       }
}
                                                                                     



                                                                                                                   

0 0
原创粉丝点击