因為在資料結構中,棧和佇列長得實在是太像了,將他們拿來比較是不可避免的,棧—後進先出,而佇列—先進先出。同樣是只能在一端進行操作,那麼問題來了,能相互實現??
能不能得好好分析一下嘛,如果是用兩個棧來實現佇列,好像這操作可以哦。**一下,你就明白!
顯然用兩個棧可以實現佇列的功能,就是借助另乙個棧來中轉一下,這樣的操作在圖論演算法中的dijkstra求最短路徑中也會用到。把後進先出轉換成先進先出。那麼怎麼用**來實現呢?既然需要兩個棧,那就定義兩個棧唄,乙個用於進佇列操作,另乙個棧就用於出佇列操作,完美解決!具體所用的棧和佇列在之前的文章已經實現,拿來用就是了。當然用鏈式的棧和佇列是最好的。
實現的時候注意一下細節哦。話不多說,上**:
#include
"linkstack.h"
template
<
typename t>
class
stacktoqueue
void
dequeue()
// 出隊需要注意細節的問題
out_stack.
pop();
// 真正的出佇列操作
}else
} t front()
const
// 獲取隊頭元素的操作與出隊操作基本一致
ret = out_stack.
top();
// 棧頂元素就是隊頭元素
}else
// 這是出佇列的棧不為空的情形
return ret;
}int
length()
const
// 直接將兩個棧的大小相加再返回
void
clear()
// 將兩個棧清空
~stacktoqueue()
};
來,測試一下是否實現了佇列的先進先出,把上面實現的**全部拷貝下面 這個測試程式,我就省略這一步了哈:
好了,棧實現了佇列。那佇列怎麼實現棧呢,還是看圖吧!
具體用栗子來說明哈。比如上圖,乙個佇列有四個元素,另乙個佇列則為空,入棧就直接將資料放到用作入棧的佇列。
那齣棧怎麼操作呢,再來看一張圖:
把第乙個佇列的n-1個元素轉移到另乙個佇列,然後是不是發現第乙個佇列只剩下乙個元素了!是的呢,那麼這個元素的位置就相當於棧頂,出棧就很容易了嘛,對第乙個佇列進行出佇列操作就完成啦。獲取棧頂元素也一樣,不過是出佇列的操作換成了獲取隊頭元素,然後將其返回。但是出棧操作之後一定要將入棧的佇列和出棧的佇列交換,這是用佇列實現棧的關鍵點。
好了,該上**了:
#include
"linkqueue.h"
template
<
typename t>
class
queuetostack
void
push
(const t& obj)
// 入棧操作
void
pop(
)// 出棧操作,需要注意
p_in-
>
dequeue()
;// 轉移完後對入佇列進行出隊操作,相當於出棧
linkqueue
* tem = p_in;
// 出棧後就馬上交換兩個指標的指向
p_in = p_out;
p_out = tem;
}else}
t top()
const
// 獲取棧頂元素
ret = p_in-
>
front()
;}else
return ret;
}int
size()
const
void
clear()
~queuetostack()
};
測試一下,是否滿足棧的後進先出!
#include
using
namespace std;
intmain
(int argc,
const
char
* ar**)
for(
int i =
0; i <10;
++ i)
return0;
}
看看輸出結果,滿足了!
用棧實現佇列 用佇列實現棧
棧的特點 filo firstinlastout 僅能從棧頂插入,刪除元素。最基本的介面包括push 從棧頂壓入元素 pop 從棧頂彈出元素 佇列的特點 fifo firstinfirstout 僅能從隊頭刪除元素,從隊尾插入元素。最基本的介面包括enque 從隊尾插入元素 deque 從隊頭刪除元...
232 用棧實現佇列 225 用佇列實現棧
用棧實現佇列 佇列是先進先出,實現佇列的最直觀的方法是用鍊錶。但本題是要求使用棧。本題兩個stack相互倒,負負得正 class myqueue def init self self.instack self.outstack defpush self,x def pop self if len s...
用棧實現佇列
正如標題所述,你需要使用兩個棧來實現佇列的一些操作。佇列應支援push element pop 和 top 其中pop是彈出佇列中的第乙個 最前面的 元素。pop和top方法都應該返回第乙個元素的值。public class solution public void push int element...