1. 程式人生 > >面試題----單鏈表實現棧

面試題----單鏈表實現棧

程式設計實現下面的棧頂操作:

class MyData
{
      void push(data);
      void pop(&data);
      bool isEmpty();
};
解析:顯然這裡需要實現棧的3種基本操作,即進棧、出棧以及判空。為了方便起見,使用單鏈表結構實現棧並且使用類的形式來定義站內及其節點。首先是節點類和棧類的具體定義,程式程式碼如下:
#include <iostream>
using namespace std;

class MyData
{
public:
	MyData() : data(0), next(NULL){}      //預設建構函式
	MyData(int value) : data(value), next(NULL){}  //帶引數的建構函式
	int data;				//資料域
	MyData *next;			//下一個節點
};

class MyStack
{
public:
	MyStack() : top(NULL) {}	//預設建構函式
	void push(MyData data);		//進棧
	void pop(MyData *pData);	//出棧
	bool IsEmpty();				//是否為空
	MyData *top;				//棧頂
};
        由於不能直接操作棧底,因此這裡沒有定義棧底的指標。在MyStack的預設夠找函式中,把棧頂指標top置空,表示此時棧為空棧。

接下來是進棧、出棧以及判空的程式碼實現,程式程式碼如下:

void MyStack::push(MyData data)
{
	MyData *pData = NULL;
	pData = new MyData(data.data);	//生成新節點
	pData->next = top;				//與原來的棧頂節點相連
	top = pData;					//棧頂節點為新加入的節點
}

void MyStack::pop(MyData *data)
{
	if(IsEmpty())				//判空
	{
		return;
	}
	data->data = top->data;		//給傳出的引數賦值
	MyData *p = top;			//臨時儲存原棧頂節點
	top = top->next;			//移動棧頂,指向下一個節點
	delete p;					//釋放原棧頂節點記憶體
}

bool MyStack::IsEmpty()
{
	return (NULL == top);    //如果top為空返回1,否則返回0
}
MyStack::push 函式表示進棧操作,它實際上就是在單鏈表的首部進行插入操作,並且top一直指向這個單鏈表的首部。

MyStack::pop 函式表示出棧操作,它實際上就是在單鏈表的首部進行刪除操作,並且top一直指向這個單鏈表的首部,另外它還把刪除節點的資料儲存到data引數中。

MyStack::IsEmpty 函式非常簡單,當棧空時,top指標為NULL,而當棧中有節點時,top指向連結串列頭,因此只需要用top與NULL進行比較即可。

下面是棧操作的測試程式碼:

int main()
{
	MyData data(0);
	MyStack s;
	s.push(MyData(1));	//進棧
	s.push(MyData(2));
	s.push(MyData(3));

	s.pop(&data);		//出棧
	cout<<"pop "<<data.data<<endl;
	s.pop(&data);
	cout<<"pop "<<data.data<<endl;
	s.pop(&data);
	cout<<"pop "<<data.data<<endl;
	cout<<"Empty = "<<s.IsEmpty()<<endl;

	return 0;
}

執行結果為:

pop 3
pop 2
pop 1
Empty = 1
Press any key to continue