C++詳解實現Stack方法
棧簡介
棧本著先進後出的原則,來存取數據。作為數據結構中的一種,這裡不多介紹相關棧。僅以此文記錄C++中棧的實現,可幫助提升編程能力與對棧的理解。
stack模擬
stack是一種容器適配器,專門在具有後進先出的上下文環境中,其刪除隻能是在一端進行操作。
stack是作為容器適配器被實現的,容器適配器即是對特定類封裝作為其底層的容器,並提供一組特定的成員函數來訪問其元素,將特定類作為其底層的,元素特定容器的尾部(即棧頂)被壓入和彈出 。
stack的底層原理可以是任何標椎的容器類模板或者一些特定的容器類,這些容器類應該支持以下操作:
- empty:判空操作。
- back:尾部元素獲取。
- push_back:尾部插入元素操作
- pop_back:尾部刪除元素操作。
模擬實現
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 << "分配內存為空" << 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; } // 運行程序: Ctrl + F5 或調試 >“開始執行(不調試)”菜單 // 調試程序: F5 或調試 >“開始調試”菜單 // 入門使用技巧: // 1. 使用解決方案資源管理器窗口添加/管理文件 // 2. 使用團隊資源管理器窗口連接到源代碼管理 // 3. 使用輸出窗口查看生成輸出和其他消息 // 4. 使用錯誤列表窗口查看錯誤 // 5. 轉到“項目”>“添加新項”以創建新的代碼文件,或轉到“項目”>“添加現有項”以將現有代碼文件添加到項目 // 6. 將來,若要再次打開此項目,請轉到“文件”>“打開”>“項目”並選擇 .sln 文件
開發環境
vs2017控制臺輸出程序。
運行結果
到此這篇關於C++詳解實現Stack方法的文章就介紹到這瞭,更多相關C++ Stack內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!