双向队列

来源:互联网 发布:2016淘宝报名双11入口 编辑:程序博客网 时间:2024/05/01 10:41

题目描述

      想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首;两头都可以做出队,入队的操作。
现在给你一系列的操作,请输出最后队列的状态;
命令格式:
LIN X  X表示一个整数,命令代表左边进队操作;
RIN X  表示右边进队操作;
ROUT
LOUT   表示出队操作;

输入

第一行包含一个整数M(M<=10000),表示有M个操作;
以下M行每行包含一条命令;
命令可能不合法,对于不合法的命令,请在输出中处理;

输出

输出的第一行包含队列进行了M次操作后的状态,从左往右输出,每两个之间用空格隔开;
以下若干行处理不合法的命令(如果存在);
对于不合法的命令,请输出一行X ERROR
其中X表示是第几条命令;

示例输入

8LIN 5RIN 6LIN 3LOUTROUTROUTROUTLIN 3

示例输出

37 ERROR
#include <stdio.h>#include <stdlib.h>#include <string.h>int a[1100],top=-1,count=0;typedef struct node{    int data;    struct node *next,*pre;}node;typedef struct{    node *front;    node *rear;}L;node p;int init(L *q){    q->front=q->rear=(node *)malloc(sizeof(node));    if(!q->front)exit(-1);    q->front->next=q->rear;    q->rear->pre=q->front;    return 1;}int Linsert(L *q,int e){    node *p;    p=(node *)malloc(sizeof(node));    p->data=e;    p->next=q->front->next;    p->pre=q->front;    q->front->next->pre=p;    q->front->next=p;    count++;    return 1;}int Rinsert(L *q,int e){    node *p;    p=(node *)malloc(sizeof(node));    p->data=e;    p->next=q->rear;    p->pre=q->rear->pre;    q->rear->pre->next=p;    q->rear->pre=p;    count++;    return 1;}int Lout(L *q){    node *p;    p=q->front->next;    q->front->next=p->next;    p->next->pre=q->front;    free(p);    count++;    return 1;}int Rout(L *q){    node *p;    p=q->rear->pre;    p->pre->next=q->rear;    q->rear->pre=p->pre;    free(p);    count++;    return 1;}int empty(L *q){    if(q->front->next==q->rear)    {count++;    return 0;}    else return 1;}int main(){    int t,e,i;    char c[10];    L q;    node *p;    scanf("%d",&t);    init(&q);    while(t--)    {        scanf("%s",c);        if(!strcmp(c,"LIN"))        {            scanf("%d",&e);            Linsert(&q,e);        }        else if(!strcmp(c,"RIN"))        {            scanf("%d",&e);            Rinsert(&q,e);        }        else if(!strcmp(c,"LOUT"))        {            if(empty(&q))                Lout(&q);            else                a[++top]=count;        }        else        {            if(empty(&q))                Rout(&q);            else                a[++top]=count;        }    }    p=q.front->next;    printf("%d",p->data);    p=p->next;    while(p!=q.rear)    {        printf(" %d",p->data);        p=p->next;    }    printf("\n");    for(i=0;i<=top;i++)        printf("%d ERROR\n",a[i]);    return 0;}


 

1 0
原创粉丝点击