队列的C++实现


队列是具有一定操作约束的线性表。只能在一端插入,在另一端删除
在这里插入图片描述
在这里插入图片描述

队列的顺序存储

#include<iostream>
using namespace std;
#define Max_size 10
class queue_m {
public:
	queue_m(){
		rear = front = 0;
	}
	void add_elem(int val);//在队尾添加元素
	int pop_elem();//将队头元素从列表中删除并返回
	void show_m();//显示队列中的所有元素
	bool IsEmpty();//判断队列是否为空
	bool IsFull();//判断队列是否满了

private:
	int rear;
	int front;
	int data[Max_size];
};
void queue_m::add_elem(int val) {
	if (this->IsFull())
	{
		cout << "队列已满,无法再进行添加" << endl;
		return;
	}
	rear = (rear + 1) % Max_size;
	data[rear ] = val;
	
}
int queue_m::pop_elem() {
	if (this->IsEmpty())
	{
		cout << "队列为空,无法再进行删除" << endl;
		return -1;
	}

	front= (front + 1) % Max_size;
	return data[front];
}
void queue_m::show_m(){
	int temp = front;
	while (temp != rear)
	{
		temp = (temp + 1) % Max_size;
		cout << data[temp] << endl;
	}

}
bool queue_m:: IsEmpty() {
	if (rear == front) {
		return true;
	}
	else
		return false;
}
 
bool queue_m::IsFull() {
	if ((rear+1)% Max_size == front) {
		return true;
	}
	else
		return false;
}
int main() {
	queue_m my_queue;
	my_queue.add_elem(3);
	my_queue.add_elem(4);
	my_queue.show_m();
	int m = my_queue.pop_elem();
	cout << m << endl;
	my_queue.show_m();

	return 0;

}

队列的链式实现

#include<iostream>
using namespace std;
#define Max_size 10
class node {
public:
	friend class queue_m;
private:
	int value;
	node* pnext;
};
class queue_m {
public:
	queue_m(){
		front=new node();
		front->pnext = NULL;
		rear = front;
	}
	void add_elem(int val);//在队尾添加元素
	int pop_elem();//将队头元素从列表中删除并返回
	void show_m();//显示队列中的所有元素
	bool IsEmpty();//判断队列是否为空
	void clear();//释放在堆区申请的内存

private:
	node *rear;
	node *front;
};
void queue_m::add_elem(int val) {
	node* pnew = new node();
	pnew->pnext = NULL;
	pnew->value = val;
	rear->pnext = pnew;
	rear = rear->pnext;
	
	
}
int queue_m::pop_elem() {
	if (this->IsEmpty())
	{
		cout << "队列为空,无法再进行删除" << endl;
		return -1;
	}
	node*temp = front;
	front = front->pnext;
	delete temp;
	return front->value;
}
void queue_m::show_m(){
	node* temp = front;
	while (temp != rear)
	{
		temp = temp->pnext;
		cout << temp->value << endl;
	}

}
bool queue_m:: IsEmpty() {
	if (rear == front) {
		return true;
	}
	else
		return false;
}
void queue_m::clear() {
	while (front->pnext!=NULL) {
		node* temp = front;
		front = front->pnext;
		delete temp;

	}
	delete front;
}

int main() {
	queue_m my_queue;
	my_queue.add_elem(3);
	my_queue.add_elem(4);
	my_queue.show_m();
	int m = my_queue.pop_elem();
	cout << m << endl;
	my_queue.show_m();

	return 0;

}

队列实现两个多项式相加

3x^3-14x^2+5x3x^4+4x^3+5x^2相加
在这里插入图片描述

#include<iostream>
//#include<alogrithem>
using namespace std;
#define Max_size 10
class node {
public:
	friend class queue_m;
private:
	int value;
	int mi;
	node* pnext;
};
class queue_m {
public:
	queue_m(){
		front=new node();
		front->pnext = NULL;
		rear = front;
	}
	void add_elem(int val,int n);//在队尾添加元素
	int pop_elem();//将队头元素从列表中删除并返回
	void show_m();//显示队列中的所有元素
	bool IsEmpty();//判断队列是否为空
	void reverse_m();//队列的反转
	void clear();//释放在堆区申请的内存
	void operator+(const queue_m&b);
private:
	node *rear;
	node *front;
	
};

void queue_m::operator+(const queue_m&b) {
	node*p1=this->front->pnext;
	node*p2 = b.front->pnext;
	queue_m ans;
	node*pre = new node();
	node*temp = pre;
	pre->pnext = NULL;
	while (p1&&p2) {
		node*pnew = new node();
		if (p1->mi == p2->mi) {
			pnew->value = p1->value + p2->value;
			pnew->mi = p2->mi;
			p1 = p1->pnext;
			p2 = p2->pnext;
		}
		else if (p1->mi > p2->mi) {
			pnew->value = p1->value;
			pnew->mi = p1->mi;
			p1 = p1->pnext;

		}
		else if (p1->mi < p2->mi) {
			pnew->value = p2->value;
			pnew->mi = p2->mi;
			p1 = p2->pnext;
		}
		pre->pnext = pnew;
		pre = pnew;
		
	}
	if (p1)
		pre->pnext = p1;
	if(p2)
		pre->pnext = p2;
	node*p = temp->pnext;
	cout << "相加之后的值为" << endl;
	while (p) {
		cout << p->value << ',' << p->mi << endl;
		p = p->pnext;
	}
}

void queue_m::add_elem(int val,int n) {
	node* pnew = new node();
	pnew->pnext = NULL;
	pnew->value = val;
	pnew->mi = n;
	rear->pnext = pnew;
	rear = rear->pnext;
	
	
}
int queue_m::pop_elem() {
	if (this->IsEmpty())
	{
		cout << "队列为空,无法再进行删除" << endl;
		return -1;
	}
	node*temp = front;
	front = front->pnext;
	delete temp;
	return front->value;
}
void queue_m::show_m(){
	node* temp = front;
	while (temp != rear)
	{
		temp = temp->pnext;
		cout << temp->value<<','<<temp->mi << endl;
	}

}
bool queue_m:: IsEmpty() {
	if (rear == front) {
		return true;
	}
	else
		return false;
}
void  queue_m::reverse_m() {

	node*temp = front->pnext;
	node *new_rear = temp;
	node*pre=NULL;
	while (temp!=NULL) {
		node* next = temp->pnext;
		temp->pnext = pre;
		pre = temp;
		temp = next;
		
	}
	node*head = new node();
	head->pnext = pre;
	rear = new_rear;
	front = head;
	
}

void queue_m::clear() {
	while (front->pnext!=NULL) {
		node* temp = front;
		front = front->pnext;
		delete temp;

	}
	delete front;
}

int main() {
	queue_m my_queue0;
	queue_m my_queue1;
	my_queue0.add_elem(3,3);
	my_queue0.add_elem(-14,2);
	my_queue0.add_elem(5,1);
	my_queue0.show_m();
	my_queue1.add_elem(3, 4);
	my_queue1.add_elem(4, 3);
	my_queue1.add_elem(5, 2);
	my_queue1.show_m();
	node*p = new node();
	my_queue1 + my_queue0;
	
	return 0;

}

猜你喜欢

转载自blog.csdn.net/qiqi__xu/article/details/89532554
今日推荐