C++筆記 | C++實例: 棧類模版

C++實例 | 棧類模版

#include <stdlib.h>

#include <iostream>
using namespace std;

// 棧的類模板
template <class T>
class Stack {
 public:
  Stack(int size);
  Stack(const Stack &p);
  virtual ~Stack();
  void Push(const T &e);
  const T &Pop();
  const T &Peek() const;
  bool IsEmpty() const;

 private:
  T *buff;
  int max;
  int top;  //當前數據所在的地方(相當於一個標記)
};

// 棧類模板的構造函數模板: 給過來棧的空間新建一個棧對象/實例化棧對象,
// 其中數據的數據類型是T
template <class T>
Stack<T>::Stack(int size) {
  buff = new T[max = size];
  top = -1;  // 剛剛開始還沒存數據呢
}

// 棧類模板的複製構造函數模板: 給定一個已經實例化的棧對象,
// 用這一棧類複製構造一個實例化棧對象
template <class T>
Stack<T>::Stack(const Stack &p) {
  buff = new T[max = p.max];
  top = p.top;
  for (int i = 0; i <= top; i++) buff[i] = p.buff[i];  //把數據挨個複製過來
}

// 棧類模板的析構函數模板
template <class T>
Stack<T>::~Stack() {
  delete[] buff;  //其他東西程序會自己析構掉, 不過帶[]的delete要自己寫的
}

// 入棧操作函數模板
template <class T>
void Stack<T>::Push(const T &e) {
  if (top >= max - 1)
    cout << "overflow!" << endl;
  else
    buff[++top] = e;
}

// 出棧操作函數模板
template <class T>
const T &Stack<T>::Pop() {
  if (top < 0) {
    cout << "underflow!" << endl;
    return buff[0];  // 老師: 這個返回值沒有意義,僅爲了通過編譯; 我:
                     // vscode上註釋掉可以通過編譯
  } else
    return buff[top--];
}

// 讀棧頂元素函數模板
template <class T>
const T &Stack<T>::Peek() const {
  if (top < 0) {
    cout << "underflow!" << endl;
    return buff[0];  // 這個返回值沒有意義,僅爲了通過編譯
  } else
    return buff[top];
}

// 判斷棧是否爲空函數模板
template <class T>
bool Stack<T>::IsEmpty() const {
  return top < 0;
}

int main() {
  Stack<double> DoubleStack(
      10);  //創建了一個名爲DoubleStack的最多可以存儲10個duoble數據的棧對象
            // T= double, size=10
  Stack<int> IntStack(
      15);  //創建了一個名爲IntStack的最多可以存儲15個int數據的棧對象
            // T= int, size=15

  //填數據
  for (double i = 1.0; i <= 20.0; i += 2.0) DoubleStack.Push(i);
  for (int j = 0; j < 75; j += 5) IntStack.Push(j);

  //在出棧之前複製, 並出棧
  Stack<double> DoubleStack2(DoubleStack);  // 複製
  while (!DoubleStack2.IsEmpty()) cout << DoubleStack2.Pop() << " ";
  cout << endl;
  Stack<int> IntStack2(IntStack);  // 複製
  while (!IntStack2.IsEmpty()) cout << IntStack2.Pop() << " ";
  cout << endl;

  //最開始的兩個棧對象現在出棧
  while (!DoubleStack.IsEmpty()) cout << DoubleStack.Pop() << " ";
  cout << endl;
  while (!IntStack.IsEmpty()) cout << IntStack.Pop() << " ";
  cout << endl;

  //這裏會自己析構掉

  system("pause");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章