1. 程式人生 > >C++實現鏈棧的基本操作

C++實現鏈棧的基本操作

之前對順序棧寫了基本操作,覺得有必要也動手練練棧的連結串列實現。

對於鏈棧,一般不會出現棧滿的情況。

鏈棧標頭檔案定義如下:

#ifndef CSTOCK_H_
#define CSTOCK_H_

typedef int elemType;

struct Item
{
	elemType data;
	Item * p_next;
};
class CStock
{
public:
	CStock();
	CStock(const CStock & otherStock); //拷貝建構函式;
	CStock & operator = (const CStock & otherStock); //=運算子過載;
	void push(elemType x);//進棧操作;
	bool pop(elemType &x); //出棧操作;
	bool isEmpty() const; //判斷棧空;
	void clear();//清空棧,使棧為空;
	int size() const; //獲得棧的大小;
	void print() const; //列印棧內元素;

	~CStock();

public:
	Item *p_Top;//棧頂
};

#endif
實現的基本功能如下:
#include "CStock.h"
#include <iostream>
using std::cout;
using std::endl;

CStock::CStock(): p_Top(NULL)//建構函式
{

}
//拷貝建構函式 便於定義時初始化,如 CStock s1 = stock; 預設的會出現潛在問題
CStock::CStock(const CStock & otherStock):p_Top(NULL)
{
   *this = otherStock;
}
// =運算子過載,便於賦值,如:CStock s1; .... CStock s2; s2 = s1;  預設的會出現潛在問題。 我寫的這個方法覺得不好,有好的寫法希望大神能指導指導。
CStock & CStock::operator =(const CStock & otherStock)
{
	CStock tempStock;
	Item * copyElement = otherStock.p_Top;
    //將棧otherStock的元素出棧,依次進入tempStock內,元素的位置順序和otherStock相反;
	while(copyElement)
	{
		tempStock.push(copyElement->data);
		copyElement = copyElement->p_next;
	}

	copyElement = tempStock.p_Top;
	//將tempStock的元素出棧,依次進入此棧內,元素位置和otherStock相同;
	while(copyElement)
	{
		push(copyElement->data);
		copyElement = copyElement->p_next;
	}

	return *this;

}
//進棧操作
void CStock::push(elemType x)
{
   Item * pushElement = new Item;
   pushElement->data = x;

   if(!p_Top)//如果棧為空時
   {
       p_Top = pushElement;
	   pushElement->p_next = NULL;
   }
   else //若棧不為空時
   {
	   pushElement->p_next = p_Top;
	   p_Top = pushElement;
   }
}

//出棧操作,若棧不為空,資料有形參x帶至主調函式,出棧失敗函式返回false;
bool CStock::pop(elemType &x)
{
   if(!p_Top)
   {
	   return false;
   }

   x = p_Top->data;
   p_Top = p_Top->p_next;

   return true;
}

//判斷棧是否為空
bool CStock::isEmpty() const
{
	return p_Top == NULL;
}

//清空棧,使棧置為空棧
void CStock::clear()
{
   Item * deleteElement;
   while(p_Top)
   {
	   deleteElement = p_Top;
	   p_Top = p_Top->p_next;
	   delete deleteElement;
   }
}

//獲得棧的大小
int CStock::size() const
{
	int length = 0;
	Item *temp = p_Top;

	while(temp && ++length)
	{
		temp = temp->p_next;
	}

	return length;
}

//列印棧內元素
void CStock::print() const
{
	int count = 0;
	Item * temp = p_Top;

	while(temp && ++count)
	{
		cout << temp->data << "\t";
		if(count % 5 == 0)
			cout << endl;

		temp = temp->p_next;
	}
}
//解構函式,提供對指標成員的釋放,預設的會出現潛在問題
CStock::~CStock(void)
{
	Item * deleteElement;
	while(p_Top)
	{
		deleteElement = p_Top;
		p_Top = p_Top->p_next;
		delete deleteElement;
	}
}