队列的顺序表实现

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX_OP 10

typedef struct vector {
	int* data;
	int size;

}vector;


vector* initVector(int n) {//初始化顺序表
	vector* v = (vector *)malloc(sizeof(vector));
	v->size = n;
	v->data = (int *)malloc(sizeof(int) * n);
	return v;

}
void clearVector(vector *v) {
	if (v == NULL)return;
	free(v->data);
	free(v);
	return;

}
int vectorSeek(vector* v, int pos) {//顺序表查看当前顺序表头数据
	if (pos < 0 || pos >= v->size)return -1;//判断当前position是否合法
	return v->data[pos];//返回当前数据

}
int  insertVector(vector *v,int pos,int val) {
	if (pos < 0 || pos >= v->size)return -1;
	v->data[pos] = val;
	return 1;

}


typedef struct Queue{//顺序表定义
	vector * data;
int size, head, tail, count;

}Queue;


Queue* initQueue(int n) {//初始化队列
	Queue* q = (Queue*)malloc(sizeof(Queue));
	q->data = initVector(n);//初始化数据区
	q->size = n;
	q->head = q->tail = q->count = 0;//数据区的head,tail,count都等于0
	return q;

}
int push(Queue* q, int val) {
	if (q->count == q->size)return 0;
	insertVector(q->data, q->tail, val);
	q->tail += 1;
	if (q->tail == q->size)q->tail = 0;
	q->count += 1;
	return 1;


}
int empty(Queue* q) {//判空操作
	return q->count == 0;//表达式成立为空,不成立不为空

}
int pop(Queue* q) {
	if (empty(q))return 0;
	q->head += 1;
	q->count -= 1;

	return 1;

}
int front(Queue* q) {//查看队列表头元素
	return vectorSeek(q->data, q->head);


}

void outputQueue(Queue* q) {
	printf("Queue:");
	for (int i = 0; i < q->count; i++) {
		printf("%4d", vectorSeek(q->data, (q->head + i) % q->size));
	}
	printf("\n\n");

	return;
}
void clearQueue(Queue* q) {
	if (q == NULL)return;
	clearVector(q->data);// 清空队列的数据区
	free(q);
	return;

}
int main() {
	srand(time(0));
	Queue* q = initQueue(5);

	for (int i= 0; i < MAX_OP; i++) {
		int op = rand() % 5;
		int val = rand() % 100;

		switch (op) {

		case 0:
		
			printf("front of queue:%d\n", front(q));
			pop(q);
			break;
		case 1:
		case 2:
		case 3:
		case 4:
			printf("push %d to queue\n", val);
			push(q,val);
			break;

		}
		outputQueue(q);
	}


	clearQueue(q);

	return 0;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值