天天看點

C++實作棧@這篇文檔是由C++代碼實作棧

@這篇文檔是由C++代碼實作棧

棧就是先進後出的一種資料結構,這篇文檔通過數組實作棧,要求是:棧是順序的(即棧的長度初始化後給定了,如果棧中插入元素到了最後一個位置表示棧已滿不能再插入新的元素),其次棧的插入類型沒有定,是以建立的是模闆類和函數模闆,最後通過調用類模闆在main()函數中實作。

本文是以Visual Studio中建立的C++win32的控制台應用程式實作的,其中建立了頭檔案和源檔案以及實作main()的demo檔案,分别是MyStack.h和MyStack.cpp和demo.cpp檔案。

MyStack.h檔案

#ifndef MYSTACK_H
#define MYSTACK_H

template <typename T>
class MyStack
{
public:
	MyStack(int length);
	virtual ~MyStack();
	int MyStackLen();
	bool MyStackEmpty();
	bool MyStackFull();
	void ClearMyStack();
	bool InsertElement(T element);
	bool DeleteElement(T &element);
	bool TraversalMyStack();
private:
	T* m_tMyStack;
	int m_iMyStackLength;
	int m_iMyStackCapacity;
	int m_iTos;
};

#endif
           

MyStack.cpp檔案

#include "MyStack.h"
#include <iostream>
using namespace std;


template <typename T>
MyStack<T>::MyStack(int length)
{
	m_iMyStackCapacity = length;
	m_tMyStack = new T[m_iMyStackCapacity];
	ClearMyStack();
}


template <typename T>
MyStack<T>::~MyStack()
{
	delete []m_tMyStack;
	m_tMyStack = NULL;
}


template <typename T>
int MyStack<T>::MyStackLen()
{
	cout << "此時的隊列長度為:" <<  m_iMyStackLength << endl;
	return 0;
}

template <typename T>
bool MyStack<T>::MyStackEmpty()
{
	return 0 == m_iTos?true:false;  //為什麼要把0寫到==前面?是因為防止将==寫成=,如果寫錯了之後程式就會報錯。
}


template <typename T>
bool MyStack<T>::MyStackFull()
{
	return m_iTos== m_iMyStackCapacity?true:false;
}

template <typename T>
void MyStack<T>::ClearMyStack()
{
	m_iMyStackLength = 0;
	m_iTos = 0;
	cout << "已經成功清除棧内的所有元素!" <<  m_iMyStackLength << endl;
}


template <typename T>
bool MyStack<T>::InsertElement(T element)
{
	if(MyStackFull())
	{
		cout << "該棧已滿,不能再插入新的元素!" << endl;
		return false;
	}
	else
	{
		m_tMyStack[m_iTos] = element;
		m_iTos++;
		m_iMyStackLength++;
		cout << "已成功加入新的元素:" << element << endl;
		return true;
	}
}


template <typename T>
bool MyStack<T>::DeleteElement(T &element)
{
	if(MyStackEmpty())
	{
		cout << "該棧為空,不能再删除元素!" << endl;
		return false;
	}
	else
	{
		m_iTos--;
		element = m_tMyStack[m_iTos];
		m_iMyStackLength--;
		cout << "已成功删除元素:"  << element << endl;
		return true;
	}
}

template <typename T>
bool MyStack<T>::TraversalMyStack()
{
	if(MyStackEmpty())
	{
		cout << "該棧為空,不能周遊出任何元素!" << endl;
		return false;
	}
	else
	{
		cout << "現将棧内的元素一一列印如下:" << endl;
		for(int i=(m_iTos-1);i>=0; i--)
		{
			cout << m_tMyStack[i] << endl;
		}
		return true;
	}
}

           

demo.cpp檔案(這個檔案中執行個體化模闆類一定要注意将MyStack.cpp檔案包含進來,要不然會報錯)

#include <iostream>
#include "MyStack.h"
#include "MyStack.cpp"
using namespace std;



int main(void)
{
	MyStack<double> stack(5);
	stack.InsertElement(10.1);
	stack.InsertElement(11.2);
	stack.InsertElement(12.3);
	stack.InsertElement(13.4);
	stack.InsertElement(14.5);
	stack.InsertElement(15.6);
	stack.TraversalMyStack();

	double e =0.1;

	stack.DeleteElement(e);
	cout << endl;
	stack.TraversalMyStack();
	cout << endl;
	stack.MyStackLen();
	stack.TraversalMyStack();

	cout << endl;
	stack.ClearMyStack();
	stack.TraversalMyStack();

	system("pause");
	return 0;
}
           

棧的實作和隊列的實作不一樣的地方就是棧隻需要一個指針m_iTos來記錄棧中元素的位置,是以無論是插入元素還是删除元素,都相對來說簡單一些,隻是在 标記元素的時候需要注意++和–的先後順序。