C++を使用して、テンプレートを使用して、チェーンスタックを実現します。


本論文の例では、C++をテンプレート類を使ってリンクスタックの具体的なコードを共有しました。参考にしてください。具体的な内容は以下の通りです。
一、実現プログラム:
1.Stock.h

#ifndef Stack_h
#define Stack_h
 
template <class T>
class Stack {
public:
  Stack(){}; //     
  void Push(const T x); //      
  bool Pop(); //       
  virtual bool getTop(T &x) const = 0; //       , x  
  virtual bool isEmpty() const = 0; //      
  // virtual bool isFull() const = 0; //      ,             
  virtual int getSize() const = 0; //         
};
 
 
#endif /* Stack_h */
2.Linked Stock.h

#ifndef LinkedStack_h
#define LinkedStack_h
#include <iostream>
#include "Stack.h"
using namespace std;
 
template <class T>
struct LinkNode {
  T data;
  LinkNode<T> *link;
};
 
//      
template <class T>
class LinkedStack;
 
//       
template <class T>
ostream& operator<<(ostream& out, LinkedStack<T>& s);
template <class T>
class LinkedStack: public Stack<T> {
public:
  LinkedStack(); //     
  ~LinkedStack();//     
  void Push(const T x); //   
  bool Pop(); //   
  bool getTop(T &x) const; //       
  bool isEmpty()const; //        
  int getSize()const; //        
  void makeEmpty(); //       
  friend ostream& operator << <T>(ostream& out, LinkedStack<T>& s); //       
private:
  LinkNode<T> *top; //     ,     
};
template <class T>
LinkedStack<T>::LinkedStack() {
  //     ,   
  top = new LinkNode<T>(); //      :     
  top->link = NULL;
}
template <class T>
LinkedStack<T>::~LinkedStack() {
  //     ,      
  makeEmpty();
}
template <class T>
void LinkedStack<T>::Push(const T x) {
  //   :    x         ,   
  LinkNode<T> *newNode = new LinkNode<T>(); //     x    
  if(newNode == NULL) {
    cerr << "        !" << endl;
    exit(1);
  }
  newNode->data = x;
  newNode->link = top->link; //            :               
  top->link = newNode; //       
}
template <class T>
bool LinkedStack<T>::Pop() {
  //   :      
  if(isEmpty())
    return false; //   ,   
  LinkNode<T> *p = top->link; //       
  top->link = p->link; //             
  delete p;
  p = NULL;
  return true;
}
 
template <class T>
bool LinkedStack<T>::getTop(T &x) const {
  //       
  if(isEmpty())
    return false;
  x = top->link->data; //    ,        。  top    ,       :top->link
  return true;
}
 
template <class T>
bool LinkedStack<T>::isEmpty()const {
  //        
  if(top->link == NULL) //    
    return true;
  return false;
}
 
template <class T>
int LinkedStack<T>::getSize()const {
  //        
  int len = 0;
  
  LinkNode<T> *current = top->link;
  while(current != NULL) {
    len++;
    current = current->link;
  }
  return len;
}
 
template <class T>
void LinkedStack<T>::makeEmpty() {
  //       
  LinkNode<T> *current = top->link;
  while(current != NULL) {
    top->link = current->link; //                    ,    
    delete current; //   
    current = NULL; //     
    current = top->link; //            
  }
}
 
template <class T>
ostream& operator<<(ostream& out, LinkedStack<T>& s) {
  //       
  LinkNode<T> *current = s.top->link;
  while(current != NULL) {
    out << current->data << " ";
    current = current->link;
  }
  return out;
}
#endif /* LinkedStack_h */
3.main.cpp

#include "LinkedStack.h"
using namespace std;
 
int main(int argc, const char * argv[]) {
  int n, x, choice, len; // val   ,choose       
  bool finished = false;
  LinkedStack<int> L; //   
  
  while(!finished) {
    cout << "1:  :" << endl;
    cout << "2:  " << endl;
    cout << "3:  :" << endl;
    cout << "4:      :" << endl;
    cout << "5:     :" << endl;
    cout << "6:       :" << endl;
    cout << "7:      :" << endl;
    cout << "8:        :" << endl;
    cout << "9:  " << endl;
    cout << "       [1-9]:" << endl;
    cin >> choice;
    switch(choice) {
      case 1:
        cout << "           :";
        cin >> n;
        cout << "        (     ):" << endl;
        for(int i=0; i < n; i++) {
          cin >> x;
          L.Push(x);
        }
        break;
      case 2:
        cout << "        :";
        cin >> x;
        L.Push(x);
        break;
      case 3:
        if(L.Pop())
          cout << "    !" << endl;
        else
          cout << "   !" << endl;
        break;
      case 4:
        if(L.getTop(x))
          cout << "       :" << x << endl;
        else
          cout << "   !" << endl;
        break;
      case 5:
        if(L.isEmpty())
          cout << "   !" << endl;
        else
          cout << "    !" << endl;
        break;
      case 6:
        len = L.getSize();
        cout << "        :" << len << endl;
        break;
      case 7:
        L.makeEmpty(); //    
        break;
      case 8:
        if(L.isEmpty())
          cout << "   !" << endl;
        else
          cout << L << endl;
        break;
      case 9:
        finished = true;
        break;
      default:
        cout << "    ,     !" << endl;
    } // switch
  } // while
  return 0;
}
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。