1. 程式人生 > >第34課 棧的概念及實現(上)

第34課 棧的概念及實現(上)

操作符 cap ons 順序存儲 異常安全 city const text cte

1. 棧的概念

(1)棧是一種特殊的線性表

(2)棧僅能在線性表的一端進行操作

  ①棧頂(Top):允許操作的一端

  ②棧底(Bottom):不允許操作的一端

(3)棧的特性——後進先出Last In First Out

技術分享

2. 棧的操作

(1)創建棧(Stack())

(2)銷毀棧(~Stack())

(3)清空棧(clear())

(4)進棧(push())

(5)出棧(pop())

(6)獲取棧頂元素(top())

(7)獲取棧的大小(size())

3. 棧的定義與實現

(1)棧的定義

技術分享

(2)棧的順序實現

技術分享

(3)Static設計要點

技術分享

  ①使用類模板實現。

  ②使用原生數組

作為棧的存儲空間

  ③使用模板參數決定棧的最大容量

【編程實驗】基於順序存儲結構的棧

//Stack.h

#ifndef _STACK_H_
#define _STACK_H_

#include "Object.h"

namespace DTLib
{

template <typename T>
class Stack : public Object
{
public:
    virtual void push(const T& elem) = 0;
    virtual void pop() = 0;
    virtual T top() const = 0;
    
virtual void clear() = 0; virtual int size() const = 0; }; } #endif // _STACK_H_

//StaticStack.h

#ifndef _STATICSTACK_H_
#define _STATICSTACK_H_

#include "Stack.h"
#include "Exception.h"

namespace DTLib
{

template <typename T, int N>
class StaticStack : public Stack<T>
{
protected:
    T m_space[N]; 
//棧存儲空間,N為模板參數 int m_top; //棧頂標識 int m_size; //當前棧的大小 public: StaticStack() //O(1) { m_top = -1; m_size = 0; } int capacity() const //O(1) { return N; } void push(const T& elem) //O(1) { if(m_size < N){ //要註意確保異常安全,即如果T類的“=”操作符發生異常時 //m_top和m_size沒被改變。 m_space[m_top + 1] = elem; m_top++; m_size++; }else{ THROW_EXCEPTION(InvalidOperationException, "No space in current stack ..."); } } void pop() //O(1) { if(m_size > 0){ m_top--; m_size--; }else{ THROW_EXCEPTION(InvalidOperationException, "No element in current stack ..."); } } T top() const //O(1) { if(m_size > 0){ return m_space[m_top]; }else{ THROW_EXCEPTION(InvalidOperationException, "No element in current stack ..."); } } void clear() //O(1) { m_top = -1; m_size = 0; } int size() const //O(1) { return m_size; } }; } #endif // _STATICSTACK_H_

//main.cpp

#include <iostream>
#include "StaticStack.h"

using namespace std;
using namespace DTLib;

int main()
{
    StaticStack<int, 10> stack;

    try{
        stack.pop();
    }catch(const Exception& e){
        cout << e.message() << endl;
        cout << e.location() << endl;
    }

    for(int i=0; i<10; i++){
        stack.push(i);
    }

    while(stack.size() > 0){
        cout << stack.top() << " ";
        stack.pop();
    }

    cout << endl;

    return 0;
}
/*輸出結果
No element in current stack ...
..\DTLib\StaticStack.h:48
9 8 7 6 5 4 3 2 1 0
*/

4. 小結

(1)棧是一種特殊的線性表

(2)棧只允許在線性表的一端進行操作

(3)StaticStack使用原生數組作為內部存儲空間

(4)StaticStack的最大容量由模板參數決定。

第34課 棧的概念及實現(上)