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!

推薦閱讀: