思考:棧和隊列在實現(xiàn)上非常相似,能否用相互實現(xiàn)?
成都創(chuàng)新互聯(lián)是一家專業(yè)提供張家界企業(yè)網(wǎng)站建設,專注與成都做網(wǎng)站、成都網(wǎng)站設計、HTML5建站、小程序制作等業(yè)務。10年已為張家界眾多企業(yè)、政府機構等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設計公司優(yōu)惠進行中。
用棧實現(xiàn)隊列等價于用“后進先出”的特性實現(xiàn)“先進先出”的特性.
實現(xiàn)思路:
template < typename T >
class StackToQueue : public Queue<T>
{
protected:
mutable LinkStack<T> m_stack_in;
mutable LinkStack<T> m_stack_out;
void move() const //O(n)
{
if(m_stack_out.size() == 0)
{
while(m_stack_in.size() > 0)
{
m_stack_out.push(m_stack_in.top());
m_stack_in.pop();
}
}
}
public:
void enqueue(const T& e) //O(1)
{
m_stack_in.push(e);
}
void dequeue() //O(n)
{
move();
if(m_stack_out.size() > 0)
{
m_stack_out.pop();
}
else
{
THROW_EXCEPTION(InvalidOperationException, "no element in current StackToQueue...");
}
}
T front() const //O(n)
{
move();
if(m_stack_out.size() > 0)
{
return m_stack_out.top();
}
else
{
THROW_EXCEPTION(InvalidOperationException, "no element in current StackToQueue...");
}
}
void clear() // O(n)
{
m_stack_in.clear();
m_stack_out.clear();
}
int length() const //O(n)
{
return m_stack_in.size() + m_stack_out.size();
}
};
評價:
雖然可以使用棧實現(xiàn)隊列,但是相比直接使用鏈表實現(xiàn)隊列,在出隊和獲取對頭元素的操作中,時間復雜度都變?yōu)榱薕(n),可以說并不高效。
使用隊列實現(xiàn)棧,本質上就是使用“先進先出”的特性實現(xiàn)?!昂筮M先出”的特性。
實現(xiàn)思路:
template < typename T >
class QueueToStack : public Stack<T>
{
protected:
LinkQueue<T> m_queue_in;
LinkQueue<T> m_queue_out;
LinkQueue<T>* m_qIn;
LinkQueue<T>* m_qOut;
void move() const //O(n)
{
while(m_qIn->length()-1 > 0)
{
m_qOut->enqueue(m_qIn->front());
m_qIn->dequeue();
}
}
void swap() //O(1)
{
LinkQueue<T>* temp = NULL;
temp = m_qIn;
m_qIn = m_qOut;
m_qOut = temp;
}
public:
QueueToStack() //O(1)
{
m_qIn = &m_queue_in;
m_qOut = &m_queue_out;
}
void push(const T& e) //O(n)
{
m_qIn->enqueue(e);
}
void pop() //O(n)
{
if(m_qIn->length() > 0)
{
move();
m_qIn->dequeue();
swap();
}
else
{
THROW_EXCEPTION(InvalidOperationException, "no element in current QueueToStack...");
}
}
T top() const //O(n)
{
if(m_qIn->length() > 0)
{
move();
return m_qIn->front();
}
else
{
THROW_EXCEPTION(InvalidOperationException, "no element in current QueueToStack...");
}
}
void clear() //O(n)
{
m_qIn->clear();
m_qOut->clear();
}
int size() const //O(1)
{
return m_qIn->length() + m_qOut->length();
}
};
總結評價:
雖然可以使用隊列實現(xiàn)棧,但是相比直接使用鏈表實現(xiàn)棧,入棧、出棧、獲取棧頂元素操作中,時間復雜度都變?yōu)榱薕(n),可以說并不高效。
分享題目:數(shù)據(jù)結構(08)_隊列和棧的相互實現(xiàn)
地址分享:http://jinyejixie.com/article24/gpgdje.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、營銷型網(wǎng)站建設、微信小程序、做網(wǎng)站、全網(wǎng)營銷推廣、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)