c语言编程队列题,[蓝桥杯][算法提高VIP]队列操作-题解(C语言代码)标准队列操作题目...

#### 直接完整的按照题目所说的要求去实现标准的队列即可。

```c

#include#include//结点定义

typedef struct node{

int data;

struct node *next;

}node;

//队列定义,队首指针和队尾指针

typedef struct queue{

node *front;

node *rear;

}queue;

//初始化结点

node *init_node(){

node *n=(node*)malloc(sizeof(node));

if(n==NULL){ //建立失败,退出

exit(0);

}

return n;

}

//初始化队列

queue *init_queue(){

queue *q=(queue*)malloc(sizeof(queue));

if(q==NULL){ //建立失败,退出

exit(0);

}

//头尾结点均赋值NULL

q->front=NULL;

q->rear=NULL;

return q;

}

//队列判空

int empty(queue *q){

if(q->front==NULL){

return 1; //1--表示真,说明队列非空

}else{

return 0; //0--表示假,说明队列为空

}

}

//入队操作

void push(queue *q,int data){

node *n =init_node();

n->data=data;

n->next=NULL; //采用尾插入法

if(q->rear==NULL){ //是否队列中无元素

q->front=n;

q->rear=n;

}else{

q->rear->next=n; //n成为当前尾结点的下一结点

q->rear=n; //让尾指针指向n

}

}

//出队操作

void pop(queue *q){

node *n=q->front;

if(empty(q)){

printf("no\n");

exit(0); //记得直接退出程序

//return ; //此时队列为空,直接返回函数结束

}

if(q->front==q->rear){//队列中是否只有一个元素

printf("%d\n",n->data);

q->front=NULL; //只有一个元素时直接将两端指向制空即可

q->rear=NULL;

}else{

q->front=q->front->next;

printf("%d\n",n->data);

free(n);

}

}

int calac(queue *q){

node *n = init_node();

n=q->front;

int cnt=0;

if(empty(q)){

return 0; //此时队列为空,直接返回函数结束

}

while (n!=NULL)

{

n=n->next;

cnt++;

}

return cnt;

}

int main(){

queue *q=init_queue();

int n;

scanf("%d",&n);

getchar();

while(n--){

int key,number;

scanf("%d",&key);

getchar();

if(key==1){

scanf("%d",&number);

getchar();

push(q,number);

}else if(key==2){

pop(q);

}else if(key==3){

printf("%d\n",calac(q));

}

}

return 0;

}

```

经人提醒,发现了一个漏洞,当队列为空的时候输出no同时需要退出整个程序,那么就直接再判断输出no之后加上exit(0);结束整个程序就可以完成了。

以下是循环的队列的实现方法:

```cpp

#include#include#include#define maxsize 50 //表示循环队列的最大容量

//循环队列的结构设计

typedef struct cir_queue{

int data[maxsize];

int rear;

int front;

}cir_queue;

//初始化

cir_queue *init(){

cir_queue *q = (cir_queue*)malloc(sizeof(cir_queue));

if(q==NULL){

exit(0); //申请内存失败,退出程序

}

memset(q->data,0,sizeof(q->data));

q->front=0;

q->rear=0;

return q;

}

//入队操作push

void push(cir_queue *q,int data){

if((q->rear+1)%maxsize==q->front){

return;

}else{

q->rear=(q->rear+1)%maxsize;

q->data[q->rear]=data;

}

}

//出队操作pop

void pop(cir_queue *q){

if(q->rear==q->front){

printf("no\n");

exit(0);

}else{

q->front=(q->front+1)%maxsize;

printf("%d\n",q->data[q->front]);

}

}

//遍历队列

void print(cir_queue *q){

int i=q->front;

while(i!=q->rear){

i=(i+1)%maxsize;

printf("%d\t",q->data[i]);

}

printf("\n"); //记得换行

}

int main(){

cir_queue *q = init();

int n;

scanf("%d",&n);

while(n--){

int k,v;

scanf("%d",&k);

if(k==1){

scanf("%d",&v);

push(q,v);

}else if(k==2){

pop(q);

}else if(k==3){

printf("%d\n",(q->rear-q->front+maxsize)%maxsize);

}

}

return 0;

}

```

0.0分

1 人评分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值