中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用兩個隊列實現一個棧

發布時間:2020-07-10 13:17:57 來源:網絡 閱讀:216 作者:稻草陽光L 欄目:開發技術

  首先,我們得了解隊列和棧的基本原理。

  隊列是一個“先進先出“的一個結構。隊列的定義是在隊尾插入,在隊頭刪除,這就要求要用一種在尾部插入容易的,在頭部刪除容易的結構,你一定會想到單鏈表,對,庫的實現就是用一個鏈表實現的。

  棧,相信大家都不會陌生,函數棧幀等的實現,它是一種”先進后出“的結構。棧的插入刪除都是在尾部進行的。

  所以要用隊列實現一個棧,要解決的問題就是在刪除時要刪除最后插入的那個元素。

  我們先來模擬一下出棧和入棧的情況:

 (1)入棧:Q1:1,2,3,4入隊列(相當于入棧);

 (2)出棧:Q1:1,2,3出隊列,Q2:1,2,3入隊列;(此時Q1只剩4,正是我們要出棧的元素)

 (3)

     1>入棧:Q1:5入隊列(每次入棧都用Q1入隊列實現,而不入隊列Q2,這樣會提高效率,后面會說到)

     2>出棧:判斷:如果Q1隊列不為空就用(1)(2)步的方法出棧最后一個元素。否則,出棧Q2隊列的最后一個元素。

 我們首先來搭建這個棧的結構:

#pragma once
#include<iostream>
#include<queue>
#include<string>
#include<assert.h>

using namespace std;

template<class T>
class MYStack
{
public:
	MYStack()
		:_size(0)
	{
	}
	~MYStack()
	{
	}
	void Push(const T& x);
	void Pop();
	bool Empty();
	size_t Size();
	void Print();


private:
	queue<T> q1;
	queue<T> q2;
	size_t _size;
};

  一個棧具有的功能我們都實現一下,Psh(),Pop(),Empty(),Size()等等。

  在這個結構中數據成員是兩個隊列的對象,因為我們是用兩個隊列來實現的,還有一個_size用來記錄棧中元素的個數。

下面是函數具體實現:

template<class T>
void MYStack<T>::Push(const T& x)
{
	q1.push(x);
	++_size;
}

template<class T>
void MYStack<T>::Pop()
{
	//assert(_size > 0);
	//size_t plen = q1.size();
	//while (plen != 1)
	//{
	//	T tmp = q1.front();
	//	q2.push(tmp);
	//	q1.pop();
	//	--plen;
	//}
	//q1.pop();
	//plen = q2.size();
	//while (plen)
	//{
	//	T tmp = q2.front();
	//	q1.push(tmp);
	//	q2.pop();
	//	--plen;
	//}
	//--_size;


	assert(_size > 0);
	size_t plen = q1.size();
	if (plen == 0)
	{
		//if (q2.size() == 0)
		//	return;
		plen = q2.size();
		while (plen != 1)
		{
			T tmp = q2.front();
			q1.push(tmp);
			q2.pop();
			--plen;
		}
		q2.pop();
	}
	else
	{
		size_t plen = q1.size();
		while (plen != 1)
		{
			T tmp = q1.front();
			q2.push(tmp);
			q1.pop();
			--plen;
		}
		q1.pop();
	}
	--_size;
}


template<class T>
bool MYStack<T>::Empty()
{
	return _size ? false : true;
}

template<class T>
size_t MYStack<T>::Size()
{
	return _size;
}

template<class T>
void MYStack<T>::Print()
{
	//size_t plen = q1.size();
	//while (plen--)
	//{
	//	cout << q1.front() << " ";
	//	q1.pop();
	//}


	size_t plen = q2.size();
	while (plen--)
	{
		cout << q2.front() << " ";
		q2.pop();
	}
	plen = q1.size();
	while (plen--)
	{
		cout << q1.front() << " ";
		q1.pop();
	}
}

  注釋掉的部分也可以實現,它的原理是不管第(3)步是出棧還是入棧,都把剩下的元素從Q2出棧入棧到Q1,輸出的時候只用輸出Q1中的元素。但是它的效率較低。如果有這種情況:1,2,3.....100000入棧,然后1,2,3......100000出棧,這會導致Q1和Q2頻繁的出棧和入棧,效率非常之低。

  優化方法就是沒有注釋部分。它的實現就是入棧都是Q1入隊列,出棧后不把Q2的元素移到Q1,這樣的話效率就會提高,只是在輸出的時候要先輸出Q2里的元素,再輸出Q1里的元素。因為Q1里的元素總是棧頂的元素。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

远安县| 怀来县| 开江县| 即墨市| 台州市| 阿荣旗| 桐乡市| 遵化市| 栾川县| 米泉市| 宾阳县| 定襄县| 苍山县| 黄陵县| 天气| 崇明县| 电白县| 陵川县| 沛县| 乌拉特前旗| 邢台市| 科技| SHOW| 盖州市| 衡水市| 尉犁县| 六盘水市| 云阳县| 凤阳县| 鄂尔多斯市| 六安市| 维西| 长宁县| 乌拉特中旗| 奉节县| 兴安盟| 大足县| 井陉县| 从化市| 山丹县| 穆棱市|