数据结构与算法--队列

文章目录

    • 队列
      • 循环队列
      • 代码1(浪费一个空间)
    • 代码2:设置flag区别空、满
    • 栈与队列的区别

队列

在这里插入图片描述

  • 定义队列
typedef struct{
     int data[Maxsize];
     int front,rear;
}SqQue;
  • 初始化队列
void InitSqQue(SqQue *&q){
	q=(SqQue *)malloc(sizeof(SqQue));
	q.rear=q.front=-1;
}
  • 判断队空(就是看队头指针和队尾指针是否重合)
bool isEmpty(SqQue *&q){
    return q.rear==q.front;
}
  • 判断是否队满(看队尾指针是否到达maxsize-1)
bool isFull(SqQue *&q){
    return q.rear==Maxsize-1;
}
  • 进队
bool Push(SqQue *&q,int e){
	//先判断队列是否满了
	if(isFull(q)) return false;
	q.rear++;
	q.data[q.rear]=e;
	return true;
}
  • 出队
bool Pop(SqQue *&q,int &e){
	//先判断是否空了
	if(isEmpty(q)) return false;
	q.front++;
	e=q.data[q.front];
	return true;
}

循环队列

  • 对于队列,出现了“假溢出”。当front往后移动时,前面的空间也就浪费了。所以我们需要利用起前面的空间,也就是循环队列。

队空的条件依旧是:q.rear==q.front;

  • 难点在于:队满的条件是什么?
q.rear=(q.rear+1)%maxsize

这一部分我还是不太理解,麻烦各位大佬评论指点!!!!!

代码1(浪费一个空间)

//循环队列
#include
#include
using namespace std;
typedef struct{
	int data[5];
	int  front,rear;
}Queue;
void InitQueue(Queue *&L){
	L=(Queue *)malloc(sizeof(Queue));
	L->rear=L->front=0;
}
bool isFull(Queue *&L){
	return (L->rear+1)%5==L->front; 
}
bool isEmpty(Queue *&L){
	return L->front==L->rear;
	
}

void pop(Queue *&L,int &e){
	if(isEmpty(L)){
		cout<<"空了"; 
		return;
	}else{
			e=L->data[L->front];
			L->front=(L->front+1)%5;
	}

}

void push(Queue *&L,int &e){
	if(isFull(L)){
		cout<<"满了";
		return;
	}else{
			L->data[L->rear]=e;
	L->rear=(L->rear+1)%5;
	}

}
void print(Queue *&L){
	while(!isEmpty(L)){
		int e;
		pop(L,e);
		cout<<e<<" ";
	}
}

int main(){
	char ch;
	Queue *L;
	InitQueue(L);
	cin>>ch;
	while(ch!='T'){
		if(ch=='p'){
			int item;
			
			cout<<"进队元素:";
			cin>>item;
			push(L,item);
			cout<<"\n";
		}
		if(ch=='q'){
			int item;
			
			cout<<"出队元素:";
			pop(L,item);
			cout<<item<<"\n";
		}
		if(ch=='s'){
			print(L);
		}
		cin>>ch;
	}
} 

代码2:设置flag区别空、满

//循环队列
#include
#include
using namespace std;
typedef struct{
	int data[5];
	int  front,rear;
	bool flag=false;
}Queue;
void InitQueue(Queue *&L){
	L=(Queue *)malloc(sizeof(Queue));
	L->rear=L->front=0;
}
bool isFull(Queue *&L){
	return L->front==L->rear&&L->flag==true; 
}
bool isEmpty(Queue *&L){
	return L->front==L->rear&&L->flag==false;
	
}

void pop(Queue *&L,int &e){
	if(isEmpty(L)){
		cout<<"空了"; 
		return;
	}else{
			e=L->data[L->front];
			L->front=(L->front+1)%5;
			L->flag=false;
	}
}

void push(Queue *&L,int &e){
	if(isFull(L)){
		cout<<"满了";
		return;
	}else{
			L->data[L->rear]=e;
	L->rear=(L->rear+1)%5;
	L->flag=true;
	}

}
void print(Queue *&L){
	while(!isEmpty(L)){
		int e;
		pop(L,e);
		cout<<e<<" ";
	}
}

int main(){
	char ch;
	Queue *L;
	InitQueue(L);
	cin>>ch;
	while(ch!='T'){
		if(ch=='p'){
			int item;
			
			cout<<"进队元素:";
			cin>>item;
			push(L,item);
			cout<<"\n";
		}
		if(ch=='q'){
			int item;
			
			cout<<"出队元素:";
			pop(L,item);
			cout<<item<<"\n";
		}
		if(ch=='s'){
			print(L);
		}
		cin>>ch;
	}
} 

栈与队列的区别

  • 共同点:它们都是由几个数据特性相同的元素组成的有限序列,也就是所谓的线性表。
  • 不同点:
    队列:在表头删除元素、在表尾增加元素。遵循“先进先出”。可在两端进行。
    栈:只在表尾进行删除、增加元素。遵循“后进先出”。只在一端进行。

你可能感兴趣的:(数据结构)