数据结构:队列- 顺序队列

#ifndef _顺序队列_H
#define _顺序队列_H

template<class T>  // 类模板,
class Queue
{
public:
	Queue(int queueCapacity=10);
	bool IsEmpty() const;
	T& Front() const; // 队尾的数据,
	T& Rear() const;
	void Push(const T& item);
	void Pop();
private:
	T *queue;
	int front; // 队尾的位置,
	int rear;  // 队首的位置是空的,
	int capacity; // 现在数组的容量,
};

template<class T>
Queue<T>::Queue(int queueCapacity):capacity(queueCapacity)
{
	if(capacity < 1) throw "Queue capacity must be > 0";
	queue = new T[capacity];
	front = rear = 0;
}

template<class T>
inline bool Queue<T>::IsEmpty() const
{
	return front == rear;
}

template<class T>
void Queue<T>::Push(const T &item)
{
	if((rear+1)%capacity==front) // 队列满了,
	{
		T* newQueue = new T[2*capacity];
		int start = (front+1)%capacity;
		if(start < 2)  // 没有回转,
			copy(queue + start, queue + start + capacity - 1,newQueue);
		else
		{
			copy(queue+start,queue+capacity,newQueue);
			copy(queue,queue+rear+1,newQueue+capacity-start); // capacity是代表原来的容量,
		}
		front = 2*capacity-1;  // 队首放在了新建容器的最后边,
		rear = capacity - 2;
		capacity *= 2;
		delete [] queue;
		queue = newQueue;
	}
	/*if(rear == capacity - 1)
		rear = 0;
	else
		rear++;*/
	rear = (rear + 1) % capacity;

	queue[rear] = item;
}

template<class T>
inline T& Queue<T>::Front() const
{
	if(IsEmpty()) throw "Queue is empty. No front element.";
	return queue[(front+1) % capacity];
}

template<class T>
inline T& Queue<T>::Rear() const
{
	if(IsEmpty()) throw "Queue is empty. No rear element";
	return queue[rear];
}

template<class T>
void Queue<T>::Pop()
{
	if(IsEmpty()) throw  "Queue is empty, Cannot delete";
	front = (front + 1) % capacity;
	queue[front].~T();
}


#endif _顺序队列_H
#include <iostream>
#include "顺序队列.h"

using namespace std;


int main()
{
	Queue<char> q(4); 

	q.Push('c');
	q.Push('u');
	q.Push('i');

	cout << q.Front() << ", " << q.Rear() << endl;
	/*q.Pop();
	cout << q.Front() << ", " << q.Rear() << endl;*/
	q.Push('y');
	q.Push('u');
	q.Push('m');
	cout << q.Front() << ", " << q.Rear() << endl;


	cout<< "xiao cui" << endl;
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值