说是双向队列的题,用队列还一直没解决,于是用了数组,这里提供两个代码,一个是我的,一个是巨巨的,对比寻找不足。
双向队列
Time Limit: 1000MS Memory Limit: 65536KBProblem 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 3Example Output
3 7 ERROR
我的代码:
01
#include <stdio.h>
02
#include <stdlib.h>
03
#include <string.h>
04
05
int
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
{
//通过看巨巨的代码,其实数组不一定要从0开始。怎么方便怎么来
14
char
s[10];
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
}
66
for
(i= 1;i<=j;i++)
67
{
68
if
(i==1)
69
printf
(
"%d"
,a[i]);
70
else
71
printf
(
" %d"
,a[i]);
72
}
73
printf
(
"\n"
);
74
for
(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
06
int
main()
07
{
//给变量起名字时,尽量做到通俗易懂
08
int
que[maxsize];
09
int
ero[10001];
10
int
m,x,i;
11
int
left,right;
12
char
str[10];
//一个left,一个right解决了我各种繁琐的数组
13
left = 10000;
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
}
48
for
(i= left;i<=right-1;i++)
49
{
50
if
(i==left)
51
printf
(
"%d"
,que[i]);
52
else
53
printf
(
" %d"
,que[i]);
54
}
55
printf
(
"\n"
);
56
for
(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