面試題----單鏈表實現棧
阿新 • • 發佈:2019-02-18
程式設計實現下面的棧頂操作:
class MyData
{
void push(data);
void pop(&data);
bool isEmpty();
};
解析:顯然這裡需要實現棧的3種基本操作,即進棧、出棧以及判空。為了方便起見,使用單鏈表結構實現棧並且使用類的形式來定義站內及其節點。首先是節點類和棧類的具體定義,程式程式碼如下:
由於不能直接操作棧底,因此這裡沒有定義棧底的指標。在MyStack的預設夠找函式中,把棧頂指標top置空,表示此時棧為空棧。#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::push 函式表示進棧操作,它實際上就是在單鏈表的首部進行插入操作,並且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::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