C++詳解實(shí)現(xiàn)Stack方法
棧簡(jiǎn)介
棧本著先進(jìn)后出的原則,來(lái)存取數(shù)據(jù)。作為數(shù)據(jù)結(jié)構(gòu)中的一種,這里不多介紹相關(guān)棧。僅以此文記錄C++中棧的實(shí)現(xiàn),可幫助提升編程能力與對(duì)棧的理解。
stack模擬
stack是一種容器適配器,專門在具有后進(jìn)先出的上下文環(huán)境中,其刪除只能是在一端進(jìn)行操作。
stack是作為容器適配器被實(shí)現(xiàn)的,容器適配器即是對(duì)特定類封裝作為其底層的容器,并提供一組特定的成員函數(shù)來(lái)訪問(wèn)其元素,將特定類作為其底層的,元素特定容器的尾部(即棧頂)被壓入和彈出 。
stack的底層原理可以是任何標(biāo)椎的容器類模板或者一些特定的容器類,這些容器類應(yīng)該支持以下操作:
- empty:判空操作。
- back:尾部元素獲取。
- push_back:尾部插入元素操作
- pop_back:尾部刪除元素操作。
模擬實(shí)現(xiàn)
template<class T, class Con = deque<T>> class stack { public: stack(); void push(const T& x) { _c.push_back(x); } void pop() { _c.pop_back(); } T& top() { return _c.back() } const T& top()const { return _c.back(); } size_t size()const { return _c.size(); } bool empty()const { return _c.empty(); } private: Con _c; }; ?
示例代碼
直接上代碼。
SeqStack.h
#pragma once #define MAX_SIZE 1024 #define TRUE 1 #define FALSE 0 typedef struct SEQSTACK { void *data[MAX_SIZE]; int size; }SeqStack; class MySeqStack { public: MySeqStack(); ~MySeqStack(); void init(); void pushStack(void *data); void * getTopStack(); void popStack(); int isEmpty(); int getSizeStack(); void clearStack(); private: SeqStack *m_stack; };
SeqStack.cpp
#include "SeqStack.h" #include <iostream> using namespace std; MySeqStack::MySeqStack() { } MySeqStack::~MySeqStack() { if (m_stack != nullptr) { delete m_stack; m_stack = nullptr; } } void MySeqStack::init() { m_stack = new SeqStack; if (m_stack == nullptr) { cout << "分配內(nèi)存為空" << endl; } else { m_stack->size = 0; for (int i = 0; i < m_stack->size; ++i) { m_stack->data[i] = nullptr; } } } void MySeqStack::pushStack(void * data) { if (m_stack->size == MAX_SIZE) { return; } if (m_stack == nullptr) { return; } if (data == nullptr) { return; } m_stack->data[m_stack->size] = data; m_stack->size++; } void * MySeqStack::getTopStack() { if (m_stack == nullptr) { return nullptr; } if (m_stack->size == 0) { return nullptr; } return m_stack->data[m_stack->size-1]; } void MySeqStack::popStack() { if (m_stack == nullptr) { return ; } if (m_stack->size == 0) { return ; } m_stack->data[m_stack->size - 1] = nullptr; m_stack->size--; } int MySeqStack::isEmpty() { if (m_stack == nullptr) { return -1; } if (m_stack->size == 0) { return TRUE; } return FALSE; } int MySeqStack::getSizeStack() { return m_stack->size; } void MySeqStack::clearStack() { if (m_stack == nullptr) { return ; } for (int i = 0; i < m_stack->size; ++i) { m_stack->data[i] = nullptr; } m_stack->size = 0; }
main.cpp
#include <iostream> #include "SeqStack.h" using namespace std; typedef struct PERSON { char name[64]; int age; int score; }Person; void test() { MySeqStack *stack = new MySeqStack; stack->init(); Person p1 = { "hudf",3,56 }; Person p2 = { "akso",4,67 }; Person p3 = {"及家屬的",6,88}; Person p4 = { "口袋",7,98 }; Person p5 = { "husdh",8,34 }; stack->pushStack(&p1); stack->pushStack(&p2); stack->pushStack(&p3); stack->pushStack(&p4); stack->pushStack(&p5); while (stack->getSizeStack() > 0) { Person *data = (Person*)stack->getTopStack(); cout << "name = " << data->name << " age= " << data->age << " score=" << data->score << endl; stack->popStack(); } delete stack; stack = nullptr; } int main() { test(); return 0; } // 運(yùn)行程序: Ctrl + F5 或調(diào)試 >“開(kāi)始執(zhí)行(不調(diào)試)”菜單 // 調(diào)試程序: F5 或調(diào)試 >“開(kāi)始調(diào)試”菜單 // 入門使用技巧: // 1. 使用解決方案資源管理器窗口添加/管理文件 // 2. 使用團(tuán)隊(duì)資源管理器窗口連接到源代碼管理 // 3. 使用輸出窗口查看生成輸出和其他消息 // 4. 使用錯(cuò)誤列表窗口查看錯(cuò)誤 // 5. 轉(zhuǎn)到“項(xiàng)目”>“添加新項(xiàng)”以創(chuàng)建新的代碼文件,或轉(zhuǎn)到“項(xiàng)目”>“添加現(xiàn)有項(xiàng)”以將現(xiàn)有代碼文件添加到項(xiàng)目 // 6. 將來(lái),若要再次打開(kāi)此項(xiàng)目,請(qǐng)轉(zhuǎn)到“文件”>“打開(kāi)”>“項(xiàng)目”并選擇 .sln 文件
開(kāi)發(fā)環(huán)境
vs2017控制臺(tái)輸出程序。
運(yùn)行結(jié)果
到此這篇關(guān)于C++詳解實(shí)現(xiàn)Stack方法的文章就介紹到這了,更多相關(guān)C++ Stack內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言線程對(duì)象和線程存儲(chǔ)的實(shí)現(xiàn)
這篇文章主要介紹了C語(yǔ)言線程對(duì)象和線程存儲(chǔ)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03C/C++經(jīng)典實(shí)例之模擬計(jì)算器示例代碼
最近在看到的一個(gè)需求,本以為比較簡(jiǎn)單,但花了不少時(shí)間,所以下面這篇文章主要給大家介紹了關(guān)于C/C++經(jīng)典實(shí)例之模擬計(jì)算器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-10-10使用C++和Direct3D (d3d)獲取屏幕截圖并根據(jù)傳入分辨率進(jìn)行縮放圖片大小(最新推薦)
這篇文章主要介紹了使用C++和Direct3D (d3d)獲取屏幕截圖并根據(jù)傳入分辨率進(jìn)行縮放圖片大小,本文給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04