首頁 > 軟體

C++詳解實現Stack方法

2022-06-25 14:02:19

棧簡介

棧本著先進後出的原則,來存取資料。作為資料結構中的一種,這裡不多介紹相關棧。僅以此文記錄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內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com