双向队列


说是双向队列的题,用队列还一直没解决,于是用了数组,这里提供两个代码,一个是我的,一个是巨巨的,对比寻找不足。

双向队列

Time Limit: 1000MS  Memory Limit: 65536KB
Problem Description

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

Input

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

Output

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

Example Input
8
LIN 5
RIN 6
LIN 3
LOUT
ROUT
ROUT
ROUT
LIN 3
Example Output
3
7 ERROR


我的代码:
01#include <stdio.h>
02#include <stdlib.h>
03#include <string.h>
04 
05int main()
06{
07   int N;
08   scanf("%d",&N);
09   int m;
10  int i,k=1,h,t;
11  int a[10005]={0},b[10005]={0};int j=0;
12  for(i = 1;i<=N;i++)
13  {
14      char s[10];
//通过看巨巨的代码,其实数组不一定要从0开始。怎么方便怎么来
15      scanf("%s",s);
16      if(strcmp("LIN",s)==0)
17      {   scanf("%d",&m);
18          j++;
19          for(h =1;h<=j;h++ )
20          {
21              t = a[h];
22              a[h] = m;
23              m = t;
24          }
25      }
26      if(strcmp("RIN",s)==0)
27      {
28          j++;
29          scanf("%d",&a[j]);
30      }
31      if(strcmp("LOUT",s)==0)
32      {
33         if(j==0)
34         {
35              b[k] = i;
36            k++;
37         }
38         else
39         {
40             for(h = 1;h<=j-1;h++)
41         {
42             a[h] = a[h+1];
43         }
44         a[j] = 0;
45         j--;
46         }
47 
48      }
49 
50    if(strcmp("ROUT",s)==0)
51      {
52 
53         if(j==0)
54         {
55 
56            b[k] = i;
57            k++;
58         }
59         else
60         {
61             a[j] = 0;
62              j--;
63         }
64}
65}
66for(i= 1;i<=j;i++)
67{
68    if(i==1)
69        printf("%d",a[i]);
70    else
71    printf(" %d",a[i]);
72}
73printf("\n");
74for(i = 1;i<=k-1;i++)
75  {
76      printf("%d ERROR\n",b[i]);
77  }
78 
79    return 0;
80}
81

巨巨的代码:

01#include <stdio.h>
02#include <stdlib.h>
03#include <string.h>
04#define maxsize 20010
05 
06int main()
07{
08    int que[maxsize];
//给变量起名字时,尽量做到通俗易懂
09    int ero[10001];
10    int m,x,i;
11    int left,right;
12    char str[10];
13    left = 10000;
//一个left,一个right解决了我各种繁琐的数组
14    right = 10000;
15    memset(ero,0,sizeof(ero));//清空函数
16    scanf("%d",&m);
17  for(i = 1;i<=m;i++)
18  {
19      scanf("%s",str);
20      if(strcmp("LIN",str)==0)
21      {
22          scanf("%d",&x);
23          que[--left] = x;
24      }
25      else if(strcmp("RIN",str)==0)
26      {
27          scanf("%d",&x);
28          que[right++] = x;
29      }
30     else  if(strcmp("LOUT",str)==0)
31      {
32         if(left>=right)
33            ero[i] = i;
34         else
35            left++;
36      }
37 
38  else if(strcmp("ROUT",str)==0)
39      {
40          if(left>=right)
41            ero[i]= i;
42          else
43            right--;
44      }
45      else
46        ero [i] = i;
47}
48for(i= left;i<=right-1;i++)
49{
50    if(i==left)
51        printf("%d",que[i]);
52    else
53    printf(" %d",que[i]);
54}
55printf("\n");
56for(i = 1;i<=m;i++)
57  {if(ero[i]!=0)
58      printf("%d ERROR\n",ero[i]);
59  }
60 
61    return 0;
62}
63 


对比两个代码,确实在编程上还有许多东西需要学习,不仅仅上技能的提高,还有规范问题,养成一个好的习惯很重要。

命令格式:
LIN X  X表示一个整数,命令代表左边进队操作;
RIN X  表示右边进队操作;
ROUT
LOUT   表示出队操作;

Input

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

Output

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

Example Input
8
LIN 5
RIN 6
LIN 3
LOUT
ROUT
ROUT
ROUT
LIN 3
Example Output
3
7 ERROR
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值