1. 程式人生 > >STL庫中的stack和queue及其模擬實現

STL庫中的stack和queue及其模擬實現

在學完了list和vector之後,緊接著就是與其相關聯的兩個資料結構棧(stack)和佇列(queue)。棧的特點是先進後出,即先進棧的元素後出棧;佇列的特點是後進先出,即先入佇列的元素先出佇列。
棧只允許在棧頂插入和刪除資料,其基本結構如下
這裡寫圖片描述
佇列只允許在隊尾插入資料,在隊頭刪除資料,其基本結構如下
這裡寫圖片描述
棧更像是一個線性表,因為vector的push_back 和 pop_back更容易實現,所以可以用vector來模擬實現stack;而佇列更像是一個連結串列,因為它有隊頭的概念,list中有兩個介面front和back,可以用來表示隊頭隊尾,出隊操作也可以用pop_front來實現。下面我們來簡單地模擬實現以下stack。

因為我們是直接使用庫中的vector來模擬實現stack,stack是一個容器介面卡,這是用了一個封裝了的類作為他的特定容器,提供了一組成員函式去訪問他的元素,元素從特定的容器,也就是堆疊的頭取出元素。
這個基礎的容器可能是任何標準的容器類,和一些其他特殊設計的模板類,唯一的要求就是要支援以下的操作
實現C++ STL,棧有兩個引數。

templete <class T,class Container=deque> class stack;

T表示元素型別,Container表示被用於儲存和訪問元素的型別。這裡因為我們用vector實現,所以Container就被賦值為vector的型別。

#pragma once

#include <iostream>
using namespace std;
#include <vector>

////靜態的棧
//template <class T,size_t n=100>
//class Stack
//{
//protected:
//  T _a[N];
//};

//動態的棧
template <class T, class Container = vector<T>>//容器介面卡
class Stack
{
public:
    void Push(const T& x)
    {
        _a.push_back(x);
    }

    void
Pop() { _a.pop_back(); } size_t Size() { return _a.size(); } bool Empty() { return _a.empty(); } T& Top() { T& top = _a.back(); return top; } protected: Container _a; }; void TestStack() { int a[] = { 1, 2, 3, 4 }; Stack<int> s; for (size_t i = 0; i < sizeof(a) / sizeof(a[0]); ++i) { s.Push(a[i]); } s.Pop(); int b = s.Size(); cout << b; }

queue也是一樣的,可以使用庫中的list實現,具體的實現方法與stack一樣,這裡直接附上程式碼。

#pragma once

#include <iostream>
using namespace std;

#include <list>

template<class T, class Container = list<T>>
class Queue
{
public:
    Queue()
    {}

    void Push(const T& x)
    {
        _a.push_back(x);
    }

    void Pop()
    {
        _a.pop_front();
    }

    T Back()
    {
        return _a.back();
    }

    T Front()
    {
        return _a.front();
    }

    size_t Size()
    {
        return _a.size();
    }

    bool Empty()
    {
        return _a.empty();
    }
protected:
    Container _a;
};

void TestQueue()
{
    Queue<int> q;
    int a[] = { 1, 2, 3, 4 };
    for (size_t i = 0; i < sizeof(a) / sizeof(a[0]); ++i)
    {
        q.Push(a[i]);
    }
    cout << q.Back() << endl;
    cout << q.Front() << endl;
    cout << q.Size() << endl;
    q.Pop();
    cout << q.Empty() << endl;
}

相關推薦

STLstackqueue及其模擬實現

在學完了list和vector之後,緊接著就是與其相關聯的兩個資料結構棧(stack)和佇列(queue)。棧的特點是先進後出,即先進棧的元素後出棧;佇列的特點是後進先出,即先入佇列的元素先出佇列。 棧只允許在棧頂插入和刪除資料,其基本結構如下 佇列只允

c++ stackqueue的使用方法

轉自 https://wenku.baidu.com/view/7d66ae3a580216fc700afded.html stack(棧)和queue(佇列)也是在程式設計中經常會用到的資料容器,STL為我們提供了方便的stack(棧)的queue(佇列)的實現。 準確地

javascriptcallapply的模擬實現

call() call() 方法呼叫一個函式, 其具有一個指定的this值和分別地提供的引數(引數的列表)。 語法:fun.call(thisArg, arg1, arg2, ...) 例

STLstackqueue函式 的使用方法

 1、stack stack 模板類的定義在<stack>標頭檔案中。 stack 模板類需要兩個模板引數,一個是元素型別,一個容器型別,但只有元素型別是必要 的,在不指定容器型別時,預設的容器型別為deque。 定義stack 物件的示例程式碼如下: st

STL模板佇列常用用法總結

1、stack的基本用法  #include<stack> (1)定義: stack<int>S; stack<string>S; (2)基本操作: S.push(x);x入棧。 S.pop();出棧(刪除棧頂元素,不返回)。

帶你深入理解STLStackQueue

上一篇部落格,帶你深入理解STL之Deque容器中詳細介紹了deque容器的原始碼實現方式。結合前面介紹的兩個容器vector和list,在使用的過程中,我們確實要知道在什麼情況下需要選擇恰當的容器來滿足需求和提升效率。一般選擇的準則有如下幾條: 如果需要隨

stl stack queue 的基本操作理解

  感覺自己寫的沒別人寫的那麼好,於是原創變成了轉載。   但是還是為了讓自己理解更透徹,加上了一些自己理解,用個詞來形容就是    創新   *-* 。 1、stack --- 後進先出 ----  LIFO      stack 模板類的定義在<stack>

javaStackQueue之間用法解釋,還有heap

Stack(堆疊)是一種後進先出的模式,只能在棧頭進行插入與刪除操作。 1.  push    把項 壓入棧頂。其作用與 addElement (item ) 相同。    引數 item 壓入棧頂的項 。 返回: item 引數 ; 2.  pop ()   移除棧頂物

模板模擬實現stackqueue

在這裡我們接下來實現兩個資料結構,一個是stack,一個是queue stack和queue資料特性? 毫無疑問,我想每一個學過資料結構的人都可以脫口而出,棧的資料特性採用的是先進後出,而佇列採用的時候先進先出。 stack和queue採用什麼

stack (C++STL常用stack基本用法的實現) ([連結串列],[陣列]的實現)

Stack:依循先進後出原則的單調佇列. 下面是用連結串列實現的stack的幾個基本用法和一個clear()的補充用法: #include<stdio.h> /* *Date:2018/

sort在STL是排序函數

operator 相等 bool 降序排序 string 數列 lin keyword compare sort在STL庫中是排序函數,有時冒泡、選擇等O(N^2)算法會超時時,我們可以使用STL中的快速排序O(N log N)完成排序 sort在<algorithm

javaRandomScanner及其循環語句

ati break clas util cal 宋體 strong 定義 tro 1.1.Scanner類及Random類的功能和使用方式 Scanner是默認按照行來讀取數字的。創建一個用來輸入的函數第一步:導包:import java.util.Scanner; 第

數據inexists關鍵字的區別

查詢 功能 body member sel 子查詢 ber rom func 數據庫中in和exists關鍵字的區別 in 是把外表和內表作hash join,而exists是對外表作loop,每次loop再對內表進行查詢。 一直以來認為exists比in效

Mysql數據CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP區別

.com http ace 當前時間 end prim AI src inf   如圖所示,mysql數據庫中,當字段類型為timestamp時,如果默認值取CURRENT_TIMESTAMP,則在insert一條記錄時,end_time的值自動設置為系統當前時間,如果勾選

數據數字中文的轉換問題

table try from tostring create select query 換問題 util public class DaoUtil{ /** * 系統字典表 * 適用於列表循環時,根據編碼獲取漢字 * @param appdi

C++標準隊列的一些基本操作

AS PE 元素 返回值 nbsp 返回 void 入隊 style 棧:   <1>使用棧,要包含頭文件:#include <stack>   <2>定義棧,stack<Type> s; 其中Type為數據類型,可以是基本數

JAVAStackHeap的區別

edit sys 靈活 double 對象 情況 編譯器 特殊 建議 轉自https://blog.csdn.net/wl_ldy/article/details/5935528 1.Java中對象都是分配在heap(堆)中。從heap中分配內存所消耗的時間

stackqueue的用法

stack stack 模板類的定義在標頭檔案中。 stack 模板類需要兩個模板引數,一個是元素型別,一個容器型別,但只有元素型別是必要的。 定義stack 物件的示例程式碼如下: stack s1; stack s2; stack 的基本操作有: 入棧,如例:s.push(x); 出棧,

用Python實現stackqueue

棧的實現 class Stack(object): """棧""" def __init__(self): self.__list = [] def push(self, item): """新增一個新的元素item到棧頂"""

泛型程式設計學習,編寫一個類似STL的簡易list的迭代器(iterator)

泛型程式設計學習,編寫一個類似STL庫中的簡易list的迭代器(iterator) 前言 近期在研究stl原始碼及stl裡各種實現的細節,初學入門免不了模仿,以下便寫一次自己的簡單的list容器的迭代器。 首先,在開始編寫List的迭代器的時候我們首先應該瞭解我們要寫的List和其迭