1. 程式人生 > >C++之佇列queue

C++之佇列queue

一、C++佇列Queue類成員函式如下:

back()返回最後一個元素

empty()如果佇列空則返回真

front()返回第一個元素

pop()刪除第一個元素

push()在末尾加入一個元素

size()返回佇列中元素的個數

       二、queue 的基本操作舉例如下:

queue入隊,如例:q.push(x); 將x 接到佇列的末端。

queue出隊,如例:q.pop(); 彈出佇列的第一個元素,注意,並不會返回被彈出元素的值。

訪問queue隊首元素,如例:q.front(),即最早被壓入佇列的元素。

訪問queue隊尾元素,如例:q.back(),即最後被壓入佇列的元素。

判斷queue佇列空,如例:q.empty(),當佇列空時,返回true。

訪問佇列中的元素個數,如例:q.size()

三、用兩個佇列實現一個棧

(1)offer2Stack.h

//========================================
//用兩個佇列實現一個棧
//Violet 2018-3-12
//========================================
#pragma once
#include <queue>
#include<exception>
using namespace std;

template<typename T> class CStack{
public:
	CStack(void);
	~CStack(void);

	void appendTop(const T& element);
	T deleteTop();
private:
	queue<T> queue1;
	queue<T> queue2;
};

template<typename T> CStack<T>::CStack(void){}
template<typename T> CStack<T>::~CStack(void){}
template<typename T> void CStack<T>::appendTop(const T& element)
{
	queue1.push(element);
}
template<typename T> T CStack<T>::deleteTop()
{
	if (queue2.size() <= 0)
	{
		while (queue1.size() > 1)
		{
			T& data = queue1.front();
			queue1.pop();
			queue2.push(data);
		}

	}
	if (queue2.size() == 0 && queue1.size()>1)//異常判斷
		throw new exception("queue2 is empty");
	if (queue1.size() == 1)
	{
		T head = queue1.front();
		queue1.pop();
		return head;
	}

	if (queue1.size() <= 0)
	{
		while (queue2.size() > 1)
		{
			T& data = queue2.front();
			queue2.pop();
			queue1.push(data);
		}

	}
	if (queue1.size() == 0&& queue2.size()>1)
		throw new exception("queue1 is empty");
	if (queue2.size() == 1)
	{
		T head = queue2.front();
		queue2.pop();
		return head;
	}
}

       (2)offer2Stack.cpp

#include "offer2Stack.h"


// ====================測試程式碼====================
template<typename T>void Test(T actual, T expected)
{
	if (actual == expected)
		printf("Test passed.\n");
	else
		printf("Test failed.\n");
}

int main(int argc, char* argv[])
{
	CStack<char> stack1;
	//CStack<int> stack2;

	stack1.appendTop('a');
	stack1.appendTop('b');
	stack1.appendTop('c');
	//stack2.appendTop(1);
	//stack2.appendTop(2);


	char head = stack1.deleteTop();
	//int head2 = stack2.deleteTop();
	Test(head, 'c');
	//Test(head2, 1);

	head = stack1.deleteTop();
	Test(head, 'b');

	stack1.appendTop('d');
	head = stack1.deleteTop();
	Test(head, 'd');

	stack1.appendTop('e');
	head = stack1.deleteTop();
	Test(head, 'e');

	head = stack1.deleteTop();
	Test(head, 'a');

	return 0;
}