91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

使用兩個棧實現一個隊列

發布時間:2020-07-10 19:16:40 來源:網絡 閱讀:265 作者:威尼斯小艇 欄目:編程語言

面試題:用兩個棧(Stack)實現一個隊列(Queue)

思路:

1、入隊時,將元素壓入s1。

2、出隊時,判斷s2是否為空,如不為空,則直接彈出頂元素;如為空,則將s1的元素逐個“倒入”s2,把最后一個元素彈出并出隊。

這個思路,避免了反復“倒”棧,僅在需要時才“倒”一次。

使用兩個棧實現一個隊列

具體實現如下:

#include<iostream>
using namespace std;
#include<stack>
#include<string>
#include<assert.h>//assert必須為.h庫文件

template<class T>
class Queue
{
public:
	void Push(const T& x);
	void Pop();
	void PrintQueue();
	bool Empty();
	size_t Size();
	T& Front();
	T& Back();
public:
	stack<T> s1;//棧s1進行入隊
	stack<T> s2;//棧s2進行出隊
};
template<class T>
void Queue<T>::Push(const T& x)
{
	s1.push(x);//s1棧入隊
}
template<class T>
void Queue<T>::Pop()
{
  if (s1.empty() && s2.empty())//兩個隊列為空
  {
   	return;
  }
	if (!s2.empty())//s2棧非空元素出棧
	{
		s2.pop();
	}
	else
	{
		while (!s1.empty()) //s2棧為空,s1中所有元素導入s2中進行s2的出棧,s1進行pop()
		{
			s2.push(s1.top());
			s1.pop();
		}
		s2.pop();//pop掉s2的棧頂元素
	}
}
template<class T>
void Queue<T>::PrintQueue()
{
	stack<T> sk1 = s1;
	stack<T> sk2 = s2;
	if (s1.empty() && s2.empty())
	{
		cout << "queue is empty!" << endl;
		return;
	}
	while (!sk2.empty())//先輸出sk2中的元素,進行sk2的出棧
	{
		cout << sk2.top() << " ";
		sk2.pop();
	}
	while (!sk1.empty())//再進行sk1中元素導入到sk2中,進行sk1的出棧
	{
		sk2.push(sk1.top());
		sk1.pop();
	}
	while (!sk2.empty())//最后在sk2中輸出sk1中元素,達到隊列出隊的效果
	{
		cout << sk2.top() << " ";
		sk2.pop();
	}
	cout << endl;
}
template<class T>
bool Queue<T>::Empty()//判空
{
	return s1.size() == 0 && s2.size() == 0;
}
template<class T>
size_t Queue<T>::Size()//隊列元素個數
{
	return s1.size() + s2.size();
}
template<class T>
T& Queue<T>::Front()//隊頭
{
	assert(s1.empty() && s2.empty());//斷言隊列是否為空
	if (!s2.empty())//s2不為空,則s2棧頂為隊頭
	{
		return s2.top();
	}
	else//s2為空,則將s1中所有元素導入s2中,新s2棧頂為隊頭
	{
		while (!s1.empty())
		{
			s2.push(s1.top());
			s1.pop();
		}
		return s2.top();
	}
}
template<class T>
T& Queue<T>::Back()//隊尾
{
	assert(!s1.empty() || !s2.empty());//s1和s2中至少有一個不為空
	if (!s1.empty())//s1不為空,則s1棧頂為隊尾
	{
		return s1.top();
	}
	else//s1為空,則將s2中所有元素導入s1中,新s1棧頂為隊尾
	{
		while (!s2.empty())
		{
			s1.push(s2.top());
			s2.pop();
		}
		return s1.top();
	}
}

測試用例如下:

void Test2()
{
	//Queue<int> q1;
	//q1.s1.push(3);
	//q1.s2.push(4);
	//q1.s2.push(5);
	//q1.Push(2);
	//q1.Push(1);
	//q1.PrintQueue();
	////q1.Pop();
	////q1.Pop();
	////q1.Pop();
	////q1.Pop();
	////q1.Pop();
	////q1.Pop();
	////q1.PrintQueue();

	Queue<string> q1;
	q1.s1.push("lllll");
	q1.s2.push("yyyyy");
	q1.s2.push("fffff");
	q1.Push("xxxxx");
	q1.Push("yyyyy");
	q1.PrintQueue();
	cout << "empty: " << q1.Empty() << endl;
	cout << "size: " << q1.Size() << endl;
	cout << "front: " << q1.Front() << endl;
	cout << "back: " << q1.Back() << endl;
}
向AI問一下細節

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

AI

元谋县| 百色市| 花莲市| 桂阳县| 红桥区| 七台河市| 山丹县| 绵竹市| 永康市| 南和县| 海口市| 金昌市| 沾化县| 乐业县| 利津县| 和政县| 光泽县| 宁阳县| 阳山县| 东乡族自治县| 黔西县| 伽师县| 昌江| 左云县| 饶阳县| 河西区| 吴堡县| 丹巴县| 武陟县| 武邑县| 江孜县| 泰安市| 运城市| 清远市| 襄垣县| 揭西县| 深泽县| 平江县| 红桥区| 西乌珠穆沁旗| 定兴县|