兩個佇列實現棧

2021-07-30 05:12:40 字數 1879 閱讀 4642

為說明思想,假設佇列、棧都很大,不會出現滿的情況。

1. 兩個棧實現佇列

//

前提已知:

struct

stack

;void initstack(stack *s);

void push(stack *s, int

k);int pop(*s);

int isstackempty(*s);

int isstackfull(*s);

實現一

s1是入棧的,s2是出棧的。

實現二思路

s1是入棧的,s2是出棧的。保證所有元素都在乙個棧裡面

比較:與實現一相比較,出佇列時不必每次都搗鼓了。

實現三思路

s1是入棧的,s2是出棧的。 比較

與實現二相比較,入隊直接入即可,感覺此時已是最優。

參考**

void enqueue(stack *s1, stack *s2, int

k)int dequeue(stack *s1, stack*s2)

}if(isstackempty(s2) == 1

)

return pop(s2);

2. 兩個佇列實現棧

//

前提已知

typedef struct

queue

queue;

void initqueue(queue *q);

void enqueue(queue *q, int

key);

int dequeue(queue *q);

int sizeofqueue(queue *q);

int isqueueempty(queue *q);

int isqueuefull(queue *q);

實現一 思路

q1是專職進出棧的,q2只是個中轉站 圖示

參考**

void push(queue *q1, queue *q2, int

k)int pop(queue *q1, queue *q2)

else

tmp =dequeue(q1);

while(isqueueempty(q2) == 0

)

return

tmp;}}

實現二思路

q1是專職進出棧的,q2只是個中轉站。元素集中存放在乙個棧中,但不是指定(q1 或 q2)。

定義兩個指標:pushtmp:指向專門進棧的佇列q1; tmp:指向臨時作為中轉站的另乙個棧q2 比較

實現二,出棧後就不用轉移回原來的棧了(圖示最後一步),這樣減少了轉移的次數。

參考**

void push(queue *q1, queue *q2, int

k)

else

enqueue(pushtmp, k);

}int pop(queue *q1, queue *q2)

else

if(isqueueempty(pushtmp))

else

tmpvalue =dequeue(pushtmp);

return

tmpvalue;}}

兩個棧實現佇列 兩個佇列實現棧

1.兩個棧實現佇列 大致思路 入佇列時,將元素入棧s1,出佇列時,將s2中的元素出棧即可,如果s2為空,那麼將s1中 s1.size 1 個元素出棧,加入到s2中,然後將s1中最後乙個元素出棧,即完成了出佇列的操作 include using namespace std include includ...

兩個棧實現佇列,兩個佇列實現棧

include include include using namespace std 使用兩個棧實現佇列,實現了push,pop,front操作 其中棧s2是輔助棧,push直接在s1中插入 pop從s2中出棧,如果s2是空的,將s1倒進s2,然後再出棧,這樣減少了倒棧次數,比較高效。front就...

兩個棧實現佇列 兩個佇列實現棧

一 題目描述 用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。二 1 自己 基本思路 乙個棧用於壓縮,乙個專門用於彈出。因為棧是先進後出,所有的元素入棧再出棧,再入棧就可以將順序調整過來。但是沒有想到優化。class solution int pop int tem...