C++ Queue 实现(数组与链表)

typedef int    ElemType;
const ElemType MaxSize = 100;
class Queue {
	ElemType       data[MaxSize];
	int            front;
	int            rear;
public:
	Queue(int f_r=-1):front(f_r),rear(f_r){};
	~Queue() {};
public:
	bool Empty() const;
	void Push_Queue(ElemType X);
	void Pop_Queue();
	ElemType Top()const;
	void show()const;
};

bool Queue::Empty()const {
	return front == rear;
}

void Queue::Pop_Queue() {
	if (rear == front)
		if(rear==-1)
		   throw std::out_of_range("Queue is empty!!");

	front += 1;
	
}

void Queue::Push_Queue(ElemType X) { 
	if (rear + 1 == MaxSize)                                //if (rear - front == MaxSize)
		throw std::out_of_range("Queue is full!!");               //throw std::out_of_range("Queue is full!!");
	else {
		rear += 1;
		data[rear] = X;
	}

}

ElemType Queue::Top()const {
	if (!Empty())
		return data[rear];
	else
		throw std::out_of_range("Queue is empty");
}

void Queue::show()const {
	if (!Empty()) {
		for (int i = front+1; i <= rear; ++i)
			std::cout << data[i] << "\n";
	}
	else
		throw std::out_of_range("Queue is empty!!");
}

int main(void)
{

	ElemType elem2 = 1;
	ElemType elem3 = 2;
	ElemType elem4 = 3;
	Queue queue;
	queue.Push_Queue(elem2);
	queue.Push_Queue(elem3);
	queue.Push_Queue(elem4);

	queue.Pop_Queue();
	queue.show();

	std::cout<<queue.Top();

	

	return 0;
}

以上是队列的数组的实现,应该比较简单。

下列是队列的链表实现:

原理图:

typedef struct   queue_node Queue;
typedef int      ElemType;
const ElemType MinSize = -9999;
struct queue_node {
	ElemType element;
	Queue*   next;
};

class ListQueue {
public:
	ListQueue(Queue* _fl, std::size_t _s): first(_fl), last(_fl), size(_s) {};
	~ListQueue() {};
public:
	bool Empty()const;
	void Pop();
	void Push();
	std::size_t Size()const;
	void Show()const;
private:
	Queue* first;
	Queue* last;
	std::size_t size;
};

bool ListQueue::Empty()const {
	return first->next == last;  
}

void ListQueue::Pop() {
	if (!Empty()) {
		auto delete_node = first;
		first= delete_node;
		--size;
	}
	else
		throw std::out_of_range("Queue is Empty!!");
}

void ListQueue::Push() {
	std::size_t n;
	ElemType X;
	std::cout << "The number of elements added to the queue is:";
	std::cin >> n;
	auto p = first;
	for (int i = 0; i < n; ++i) {
		Queue* s = new Queue;
		std::cout << "Please enter a elem :";
		std::cin >> X;
		s->element = X;
		p->next = s;
		p = s;
		++size;
	}
	p->next = last;
	last->element = MinSize;
}

std::size_t ListQueue::Size()const {
	return size;
}

void ListQueue::Show()const {
	if (!Empty()) {
		auto p = first->next;
		while (p->element != MinSize) {
			std::cout << p->element << "\n";
			p = p->next;
		}
	}
	else
		throw std::out_of_range("Queue is Empty!!");
}

int main(void)
{
	Queue* qhead = new Queue;
	std::size_t t = 0;
	ListQueue queue(qhead, t);
	queue.Push();
	queue.Show();
	
	queue.Pop();
	std::cout << "The queue deletes an element:";
	queue.Show();

	std::cout << "The size of the queue is:" << queue.Size() << "\n";

	return 0;
}

发布了50 篇原创文章 · 获赞 11 · 访问量 4096

猜你喜欢

转载自blog.csdn.net/qq_43145594/article/details/100191508