c 棧,佇列,迴圈佇列 簡單實現

2021-06-17 00:02:19 字數 3255 閱讀 3846

棧:

#include

using namespace std;

template

struct node

};template

class stack

bool push(const t & e);

const t& pop();

const t& gtop();

bool empty();

int  size();

bool clear();

private:

node* top;

node* bottom;

};template

bool stack::push(const t & e)

template

const t & stack::pop()

if(empty())

cout<<"棧為空,pop失敗!"node* p=bottom;

node* q=null;

while(p->next)

q->next=null;

top=q;

t e=p->date;

delete p;

return e;

}template

const t& stack::gtop()

if(empty())

cout<<"棧為空,gtop失敗!"return top->date;

template

bool stack::empty()

if(top==bottom)

return true;

else

return false;

template

int stack::size()

}template

bool stack::clear()

return true;

}int main()

};template

class queue

bool add(const t & e);

const t & del();

bool empty();

int  size();

bool clear();

private:

node* front;

node* rear;

};template

bool queue::add(const t & e)

template

const t & queue::del()

node* p=front->next;

t e=p->date;

front->next=p->next;

delete p;

return e;

}template

bool queue::empty()

else

}template

int queue::size()

return i;

}template

bool queue::clear()

return true;

}int main()

else

q.clear();

return  0;

}迴圈佇列:

迴圈佇列中,由於入隊時尾指標向前追趕頭指標;出隊時頭指標向前追趕尾指標,造成隊空和隊滿時頭尾指標均相等。因此,無法通過條件front==rear來判別佇列是"空"還是"滿"。

解決這個問題的方法至少有兩種:

① 另設一布林變數

以區別佇列的空和滿;

②另一種方式就是資料結構

常用的: 隊滿時:(rear+1)%n==front,n為佇列長度(所用陣列

大小),由於rear,front均為所用空間的指標,迴圈只是邏輯上的迴圈,所以需要求餘運算。如圖情況,隊已滿,但是rear(5)+1=6!=front(0),對空間長度求餘,作用就在此6%6=0=front(0)。

#include

using namespace std;

#define queuesize 10

template

class cirqueue

public:

cirqueue():front(0),rear(0),count(0)

boolempty();

boolfull();

booladd(const t& e);

booldel(t &e);

int  size();

private:

int  front;

int  rear;

intcount;

t   date[queuesize];

template

bool cirqueue::empty()

if(rear%queuesize==front)

returntrue;

else

returnfalse;

template

bool cirqueue::full()

if((rear+1)%queuesize==front)

returntrue;

else

returnfalse;

template

bool cirqueue::add(const t& e)

if(full())

cout<<"佇列已滿,add失敗!"date[rear]=e;

rear++;

count++;

returntrue;

template

bool cirqueue::del(t & e)

if(empty())

cout<<"隊列為空!,del失敗!"e=date[front];

front++;

count--;

returntrue;

template

int cirqueue::size()

returncount;

int main()

cirqueueq;

if(q.empty())

cout<<"隊列為空!"q.add(9);

q.add(8);

cout<<"佇列長度:"cout<<"佇列已滿!"cout<<"佇列未滿!"q.add(i);

if(q.full())

cout<<"佇列已滿!"cout<<"佇列未滿!"q.del(e);

cout<<"出隊:"

C語言實現,順序佇列,迴圈佇列,和棧!

佇列是一種特殊的 線性表,特殊之處在於它只允許在表的前端 front 進行刪除操作,而在表的後端 rear 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列的資料元素又稱為佇列元素。在佇列中插入乙個佇列元素稱為入隊,從佇列中刪除乙個佇列元...

佇列實現棧棧實現佇列

佇列是一種先進先出的資料結構,要想實現先進後出,需加乙個輔助佇列進行資料的來回倒 引用交換 從而實現棧結構。例如 5 4 3 2 1 用乙個輔助佇列裝 4 3 2 1,把5彈出,在把 4 3 2 1放回原佇列,如此反覆可變成5 4 3 2 1的棧結構。棧是一種先進後出的資料結構,要想實現先進先出,同...

佇列實現棧,棧實現佇列

兩個佇列實現棧 每次進入乙個佇列,取出得時候,把所有元素進入另乙個佇列,只留下乙個元素,以此實現棧的先進後出 filo package algorithmbymyself import j a.util.linkedlist import j a.util.queue 用兩個佇列實現乙個棧 publ...