队列顺序表、链表基本操作
队列顺序表:
#include<stdio.h>
#include<stdlib.h>
#define QElemType int
#define MAXQSIZE 100
#define Status int
#define OVERFLOW 0
typedef struct{
QElemType *base; //存储空间基地址
int front;
int rear;
}SqQueue;
Status InitQueue(SqQueue &Q){
Q.base = new QElemType[MAXQSIZE];
if(!Q.base) exit(OVERFLOW);
Q.front = Q.rear = 0;
return 1;
}
void QueueLength(SqQueue &Q){
printf("队列总长度为%d\n",((Q.rear-Q.front+MAXQSIZE)%MAXQSIZE));
}
Status EnQueue(SqQueue &Q,QElemType &e){
//判断队列数据是否满
if((Q.rear+1)%MAXQSIZE == Q.front){
return 0;
}
Q.base[Q.rear] = e;
Q.rear = (Q.rear+1)%MAXQSIZE;
return 1;
}
Status DeQueue(SqQueue &Q,QElemType &e){
//判断队列数据是否空
if(Q.rear == Q.front){
return 0;
}
e = Q.base[Q.front];
Q.front = (Q.front+1)%MAXQSIZE;
return 1;
}
void EntoQueue(SqQueue &Q){
int n;
QElemType e;
int flag;
printf("请输入你要入队几个数据:\n");
scanf("%d",&n);
for(int i = 0;i < n;i++){
printf("请输入你要插入第%d个数据是:\n",i+1);
scanf("%d",&e);
flag = EnQueue(Q,e);
if(flag){
printf("%d已入队列\n",e);
}else{
printf("队列已满!\n");
}
}
}
void DetoQueue(SqQueue &Q){
int n;
QElemType e;
int flag;
printf("请输入你要出队几个数据:\n");
scanf("%d",&n);
for(int i = 0;i < n;i++){
flag = DeQueue(Q,e);
if(flag){
printf("%d已出队列\n",e);
}else{
printf("队列已空!\n");
}
}
}
void GetHead(SqQueue &Q){
if(Q.front == Q.rear){
printf("队列为空!\n");
}else{
printf("队头元素为%d\n",Q.base[Q.front]);
}
}
menu(){
printf("***************\n");
printf("1.入队\n");
printf("2.出队\n");
printf("3.取队列长度\n");
printf("4.取循环队列的队头元素\n");
printf("5.退出\n");
printf("***************\n");
}
int main(){
SqQueue Q;
InitQueue(Q);
while(1){
menu();
int choice;
printf("请选择操作菜单:\n");
scanf("%d",&choice);
if(choice == 5) break;
switch(choice){
case 1:EntoQueue(Q); break;
case 2:DetoQueue(Q); break;
case 3:QueueLength(Q);break;
case 4:GetHead(Q); break;
default:printf("输入错误!!\n");
}
}
return 0;
}
队列链表:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define QElemType int
#define Status int
#define MaxQSIZE 100
//队列链是有一个指向首元节点的头结点的,而栈链没有头结点,直接就是首元结点
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue &Q){
Q.front = Q.rear = new QNode;
Q.front->next = NULL;
return 1;
}
Status EnQueue(LinkQueue &Q,QueuePtr &p,QElemType &e){
p = new QNode;
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return 1;
}
Status DeQueue(LinkQueue &Q,QueuePtr &p,QElemType &e){
if(Q.front == Q.rear) return 0;
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if(Q.rear == p) Q.rear=Q.front; //这时队列里只有一个数据了,再次让Q.rear == Q.front;
free(p);
return 1;
}
void EntoQueue(LinkQueue &Q,QueuePtr &p){
int flag;
int n;
QElemType e;
printf("请输入你要入队列几个数据:\n");
scanf("%d",&n);
for(int i = 0;i<n;i++){
printf("请输入你要进入的第%d个数据是:\n",i+1);
scanf("%d",&e);
flag = EnQueue(Q,p,e);
if(flag){
printf("%d入队成功!\n",e);
}else{
printf("入队失败!\n");
}
}
}
void DetoQueue(LinkQueue &Q,QueuePtr &p){
int flag;
int n;
QElemType e;
printf("请输入你要出队列几个数据:\n");
scanf("%d",&n);
for(int i = 0;i<n;i++){
flag = DeQueue(Q,p,e);
if(flag){
printf("%d出队成功!\n",e);
}else{
printf("出队失败!\n");
}
}
}
void GetHead(LinkQueue &Q){
if(Q.front != Q.rear){ //队列非空
printf("队头数据为%d:\n",Q.front->next->data);
}
}
menu(){
printf("***************\n");
printf("1.入队\n");
printf("2.出队\n");
printf("3.取队头元素\n");
printf("4.退出\n");
printf("***************\n");
}
int main(){
LinkQueue Q;
QueuePtr p;
InitQueue(Q);
while(1){
menu();
int choice;
printf("请选择操作菜单:\n");
scanf("%d",&choice);
if(choice == 4) break;
switch(choice){
case 1:EntoQueue(Q,p); break;
case 2:DetoQueue(Q,p); break;
case 3:GetHead(Q);break;
default:printf("输入错误!!\n");
}
}
return 0;
}