C Language 栈和队列 - 顺序队列

Posted Adorable_Rocy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C Language 栈和队列 - 顺序队列相关的知识,希望对你有一定的参考价值。

前言:最开始的顺序队列中的顺序存储结构设计比较单一,导致出现队列中出现假溢出这样的情况,判断条件为:当front与rear相等时,

  • 创建结构体
struct SqQueue{
	int data[MaxSize];
	int fornt,rear;
};

-初始化队列算法:

//初始化
void initQueue(SqQueue *&s){
	
	s = (SqQueue *)malloc(sizeof(SqQueue));
	s->fornt=s->rear=-1;
	
} 
  • 创建队列算法:
//创建队列
void createQueue(SqQueue *&s){
	int num = 5;
	
	while(num >= 0){
		s->rear = s->rear + 1;
		s->data[s->rear] = num--;
	}
} 
  • 出队算法:
//出队
void outOfQueue(SqQueue *s){
	while(s->fornt != s->rear){
		s->fornt = s->fornt + 1;
		printf("%3d",s->data[s->fornt]);
	}
} 
  • 销毁队列算法:
//销毁队列
void destoryQueue(SqQueue *&s){
	free(s);
	printf("\\n释放完毕");
} 
  • 运行结果如下:

(二)环形队列

根据最初的队列来看,发现之前的队列的定义方式出现了假溢出的问题,那我们可以使用环形队列来解决这个问题。

  • 创建和定义结构体
#define MaxSize 6

struct SqQueue{
	int data[MaxSize];
	int front , rear;
};
  • 创建环形队列算法:
//创建环形队列
void createQueue(SqQueue *&s){
	
	if(((s->rear + 1) % MaxSize) == (s->front % MaxSize)){
		printf("队列已满");
		exit(1);
	}
	
	while(((s->rear + 1) % MaxSize) != (s->front % MaxSize))
	{
		s->rear = s->rear + 1;
		s->data[s->rear] = s->rear;
	}
}

补充:这里主要改进的地方是,牺牲一个元素空间用来判断队满队空的标志,也是在环形队列中最为常用的方法,所以这里环形队列中的元素是从下标位1开始到n-1个元素


如图所示,rear指针和front指针初始化是指向0位置的,入队的时候是从下一个位置开始入队,出队也是一样

  • 出队算法:
//环形队列出队
void outOfQueue(SqQueue *s){
		
		if((s->rear) % MaxSize == s->front % MaxSize){
				printf("队列为空"); 
				exit(1);
		}
		
		while((s->front) % MaxSize != (s->rear % MaxSize)){
			s->front = s->front + 1; 
			printf("%3d",s->data[s->front]);
		}
		printf("\\n出队完毕!\\n");
} 

  • 最终结果展示:

以上是关于C Language 栈和队列 - 顺序队列的主要内容,如果未能解决你的问题,请参考以下文章

C Language 栈和队列 - 链队列

C Language 栈和队列 - 链栈

c 语言数据结构栈和队列的相关操作

数据结构(使用C语言)队列

[Python] 数据结构--实现顺序表链表栈和队列

栈和队列