使用兩個棧實現一個佇列
阿新 • • 發佈:2019-01-02
4、程式碼實現
這裡使用第二種優化方法倆實現兩個棧實現一個佇列的操作,下面我將按照下面步奏實現上述操作;
(1)利用前插法建立鏈式棧liststack:
(2)建立likequeue類封裝兩個鏈式棧liststack,設定成員函式popqueue()pushqueue()來分別實現佇列的壓入操作和彈出操作,其中成員函式S1insertS2()是把插入棧S1中的元素倒入S2中的操作函式,程式碼如下:
#include<iostream> #include <assert.h> using namespace std; struct node { int data; node* link; node(const int &T, node* p = NULL){ data = T, link = p; }; }; //建立鏈式棧 class liststack { public: liststack(); ~liststack(); void push(int); bool pop(); node* gettop(); bool isempty(); void MarkEmpty(); friend ostream& operator<<(ostream& os, liststack&TEST); private: node* top; }; liststack::liststack() { //不需要附加頭 top =NULL; } liststack::~liststack() { MarkEmpty(); } void liststack::push(int temp) { if (!isempty()) { node* newnode = new node(temp); assert(newnode!=NULL); newnode->link = top; top = newnode; } else { node* newnode = new node(temp); assert(newnode != NULL); newnode->link = NULL; top = newnode; } } bool liststack::pop() { if (isempty()) return false; else { node* newnode = top; top=top->link; delete newnode; return true; } } void liststack::MarkEmpty() { while (top!=NULL) { node* newnode = top; top = top->link; delete newnode; } } bool liststack::isempty() { return top == NULL ? true: false; } node* liststack::gettop() { return top; } ostream& operator <<(ostream& os, liststack&TEST) { node *out = TEST.top; while (out) { os << out->data << endl; out = out->link; } return os; }; //建立likequeue類封裝兩個鏈式棧liststack,實現佇列的功能 class likequeue { public: void pushqueue(int); bool popqueue(); bool S1insertS2(); liststack S1, S2; }; void likequeue::pushqueue(int test) { S1.push(test); } bool likequeue::popqueue() { if (S2.isempty()) { S1insertS2(); } S2.pop(); return true; } bool likequeue::S1insertS2() { if (S1.isempty()&&!S2.isempty()) return false; node* S1top = S1.gettop(); while (S1top) { S2.push(S1top->data); S1top = S1top->link; S1.pop(); } return true; } void main() { likequeue testqueue; testqueue.pushqueue(1);//壓入1 testqueue.pushqueue(2);//壓入2 testqueue.popqueue();//彈出1 //第一次輸出佇列 liststack* test = &testqueue.S2;//-------------------------更改1處 operator<<(cout, *test); system("pause"); }