棧 (stack)又稱堆棧,是一種受限制的線性表,其限制是只允許在表的一端進行插入和刪除。
允許操作的一端稱為棧頂(top),不允許 操作的稱為棧底(bottom),每每次刪除的數據元素總是最后插入的數據元素,所以棧又稱為“后入先出表”。
棧的儲存結構有2種:一種順序儲存結構(順序棧),一種鏈式儲存結構(鏈式棧)。
今天主要來看看如何實現一個棧的功能
首先,棧的基本功能有:
1. empty 判斷堆棧是否為空
2. pop 向堆棧里面壓入一個數據
3. push 向堆棧壓入一個數據
4. size 返回當前堆棧長度(即內部數據個數)
5. top 得到堆棧棧頂數據
實現:
1.利用之前的vector來實現:
stack1.h文件
#pragma once #include <vector> using namespace std; template <class Object> class Stack { public: Stack(void); bool isEmpty() const; const Object & top() const; void makeEmpty(); void pop(); void push(const Object & x); Object topAndPop(); ~Stack(); private: vector<Object> theArray; int topOfStack; };
stack1.cpp
#include "stack1.h" //利用vector template <class Object> Stack<Object>::Stack():theArray(1) { topOfStack=-1; } template <class Object> bool Stack<Object>::isEmpty() const { return topOfStack==-1; } template <class Object> void Stack<Object>::makeEmpty() { this->topOfStack=-1; } template <class Object> void Stack<Object>::push(const Object & x) { if(topOfStack==theArray.size()-1) theArray.resize(theArray.size()*2+1); theArray[++topOfStack]=x; } template <class Object> const Object & Stack<Object>::top() const { if(isEmpty()) throw underflow_error( "堆棧已經為空" ); return theArray[topOfStack]; } template <class Object> void Stack<Object>::pop() { if(isEmpty()) throw underflow_error( "堆棧已經為空" ); topOfStack--; } template <class Object> Object Stack<Object>::topAndPop() { if(isEmpty()) throw underflow_error( "堆棧已經為空" ); return theArray[topOfStack--]; } template <class Object> Stack<Object>::~Stack() { }
2.利用數組實現:
stack2.h
#pragma once typedef int DataType; const int MaxStatckSize = 50; //棧大小 class StackDemo { private: DataType stacklist[MaxStatckSize]; int top;//棧頂 public: //構造函數 StackDemo(void); ~StackDemo(void); public: //壓棧出棧操作 void Push(const DataType &item); DataType Pop(void); void ClearStack(void); //訪問棧頂 DataType Peek(void)const; //檢測椎棧 bool isEmpty(void)const; bool isFull(void)const; };
stack2.cpp
#include "stack2.h" #include <iostream> StackDemo::StackDemo(void) { this->top = -1; } StackDemo::~StackDemo(void) { this->top = -1; } void StackDemo::Push(const DataType &item) { //棧是否已滿 if(!isFull()) { top += 1; this->stacklist[top] = item; } else std::cout << "Out of the Stack!" << std::endl; } DataType StackDemo::Pop(void) { if(!isEmpty()) { int ebp = top; top -= 1; return stacklist[ebp]; } else return -1; } DataType StackDemo::Peek(void)const { return top; } void StackDemo::ClearStack() { for(int i = top;i >=0 ;i--) stacklist[i] = 0; top = -1; std::cout << "Clear stack done!" << std::endl; } bool StackDemo::isFull(void)const { return top > MaxStatckSize?true:false; } bool StackDemo::isEmpty(void)const { return top < 0 ?true:false; }
