#### 直接完整的按照题目所说的要求去实现标准的队列即可。
```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 人评分