数据结构实验之栈与队列十一:refresh的停车场

Problem Description

refresh最近发了一笔横财,开了一家停车场。由于土地有限,停车场内停车数量有限,但是要求进停车场的车辆过多。当停车场满时,要进入的车辆会进入便道等待,最先进入便道的车辆会优先

进入停车场,而且停车场的结构要求只出去的车辆必须是停车场中最后进去的车辆。现告诉你停车场容量N以及命令数M,以及一些命令(Add num 表示车牌号为num的车辆要进入停车场或便道,

Del 表示停车场中出去了一辆车,Out 表示便道最前面的车辆不再等待,放弃进入停车场)。假设便道内的车辆不超过1000000.

Input

输入为多组数据,每组数据首先输入N和M(0< n,m <200000),接下来输入M条命令。

Output

输入结束后,如果出现停车场内无车辆而出现Del或者便道内无车辆而出现Out,则输出Error,否则输出停车场内的车辆,最后进入的最先输出,无车辆不输出。

Sample Input

2 6
Add 18353364208
Add 18353365550
Add 18353365558
Add 18353365559
Del
Out

Sample Output

18353365558
18353364208

Hint

Source

注:原来做的时候,栈没有用base指针,一直错误,还没有找到出现问题的原因

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4
  5
  6 typedef struct node
  7 {
  8     char num[25];
  9     struct node *next;
 10 } Node;
 11
 12 typedef struct
 13 {
 14     Node *top;
 15     Node *base;
 16     int len;
 17 } SeqStack;
 18
 19 typedef struct
 20 {
 21     Node *front;
 22     Node *rear;
 23     int len;
 24 } SeqQueue;
 25
 26 Node* NewNode()
 27 {
 28     Node *p;
 29     p = (Node*)malloc(sizeof(Node));
 30     p->next = NULL;
 31     return p;
 32 }
 33
 34 // 接下来是对栈的操作
 35
 36 SeqStack* CreateStack()
 37 {
 38     SeqStack *t;
 39     t = (SeqStack*)malloc(sizeof(SeqStack));
 40     t ->top =NewNode();
 41     t->base = t->top;
 42     t->len = 0;
 43     return t;
 44 }
 45
 46 int IsEmptyS(SeqStack *s)
 47 {
 48     if (s->top->next == NULL)
 49         return 1;
 50     return 0;
 51 }
 52
 53 void PushS(SeqStack *s, char num[])
 54 {
 55     Node *p = NewNode();
 56     strcpy(p->num,num);
 57     p->next = s->top->next;
 58     s->top->next = p;
 59     s->base = p;
 60     s->len++;
 61 }
 62
 63 void PopS(SeqStack *s)
 64 {
 65     Node *t;
 66     t = s->top->next;
 67     s->top->next = s->top->next->next;
 68     free(t);
 69     s->len--;
 70 }
 71
 72 void ClearS(SeqStack* s)
 73 {
 74     while(!IsEmptyS(s))
 75     {
 76         PopS(s);
 77     }
 78 }
 79 // 接下来是对队列的操作
 80
 81 SeqQueue* CreateQueue()
 82 {
 83     SeqQueue *q;
 84     q = (SeqQueue*)malloc(sizeof(SeqQueue));
 85     q->front = NewNode();
 86     q->rear = q->front;
 87     q->len = 0;
 88     return q;
 89 }
 90
 91 int IsEmptyQ(SeqQueue *q)
 92 {
 93     if (q->front->next == NULL)
 94         return 1;
 95     return 0;
 96 }
 97
 98 void PushQ(SeqQueue *q, char num[])
 99 {
100     Node *t = NewNode();
101     strcpy(t->num, num);
102     q->rear->next = t;
103     q->rear = t;
104     q->len++;
105 }
106
107 void PopQ(SeqQueue *q)
108 {
109     Node *t = q->front->nexxt;
110     q->front->next = q->front->next->next;
111     free(t);
112     q->len--;
113 }
114
115 void show(Node *t)
116 {
117     Node *p = t->next;
118     while(p)
119     {
120         printf("%s\n", p->num);
121         p = p->next;
122     }
123 }
124
125 void ClearQ(SeqQueue *q)
126 {
127     if(!IsEmptyQ(q))
128     {
129         PopQ(q);
130     }
131 }
132
133 int main()
134 {
135     int n, m;
136     char str[25];
137     char num[25];
138     SeqQueue *q;
139     SeqStack *s;
140     s = CreateStack();
141     q = CreateQueue();
142     while(~scanf("%d%d", &n, &m))
143     {
144         int flag = 1;
145         ClearS(s);
146         ClearQ(q);
147         while(m--)
148         {
149             scanf("%s", str);
150             if (strcmp(str, "Add") == 0)  // 如果栈没满,入栈,否则入队
151             {
152                 scanf("%s", num);
153                 if (s->len >= n)
154                 {
155                     PushQ(q, num);
156                 }
157                 else
158                 {
159                     PushS(s, num);
160                 }
161             }
162             else if (strcmp(str, "Del") == 0)  // 如果栈没空,则出栈,同时后面的车出队入栈
163             {
164                 if (!IsEmptyS(s))
165                 {
166                     PopS(s);
167                     if (!IsEmptyQ(q))
168                     {
169                         strcpy(num,q->front->next->num);
170                         PopQ(q);
171                         PushS(s, num);
172                     }
173                 }
174                 else
175                 {
176                     flag = 0;
177                 }
178             }
179             else if (strcmp(str, "Out") == 0)  // 不排队,出队
180             {
181                 if (!IsEmptyQ(q))
182                 {
183                     PopQ(q);
184                 }
185                 else
186                 {
187                     flag = 0;
188                 }
189             }
190         }
191         if (flag == 0)
192         {
193             printf("Error\n");
194         }
195         else
196         {
197             show(s->top);
198         }
199     }
200     return 0;
201 }

原文地址:https://www.cnblogs.com/sugerandmaster/p/11562044.html

时间: 2024-10-01 01:17:17

数据结构实验之栈与队列十一:refresh的停车场的相关文章

SDUT-2088_数据结构实验之栈与队列十一:refresh的停车场

数据结构实验之栈与队列十一:refresh的停车场 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description refresh最近发了一笔横财,开了一家停车场.由于土地有限,停车场内停车数量有限,但是要求进停车场的车辆过多.当停车场满时,要进入的车辆会进入便道等待,最先进入便道的车辆会优先 进入停车场,而且停车场的结构要求只出去的车辆必须是停车场中最后进去的车辆.现告诉你停车场容量N以及命令数M,以及一些命令(Add num 表

SDUT 2449 数据结构实验之栈与队列十:走迷宫

数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数. Input 第一行一个整数T 表示有T 组测试数据.(T <= 110) 对于每组测试数据: 第一行两个整数n, m,表示迷宫有n * m 个格子.(1

SDUT-3335_数据结构实验之栈与队列八:栈的基本操作

数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 堆栈是一种基本的数据结构.堆栈具有两种基本操作方式,push 和 pop.push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出.现在我们就来验证一下堆栈的使用. Input 首先输入整数t(1 <= t <= 10),代表测试的组数,以后是 t 组输入. 对于每组测试数据,第一行输入两个正整数 m(1 <= m &

SDUT-2449_数据结构实验之栈与队列十:走迷宫

数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数. Input 第一行一个整数T 表示有T 组测试数据.(T <= 110) 对于每组测试数据: 第一行两个整数n, m,表示迷宫有n * m 个格子.(1

数据结构实验之栈与队列九:行编辑器

数据结构实验之栈与队列九:行编辑器 Description 一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区. 由于用户在终端上进行输入时,不能保证不出差错,因此,若在编辑程序中,“每接受一个字符即存入用户数据区”的做法显然不是最恰当的.较好的做法是,设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区.允许用户输入出差错,并在发现有误时可以及时更正.例如,当用户发现刚刚键入的一个字符是错的时,可补进一个退格符"#",以表示前一个字符无

数据结构实验之栈与队列二:一般算术表达式转换成后缀式

数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Description 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. Input 输入一个算术表达式,以‘#’字符作为结束标志. Output 输出该表达式转换所得到的后缀式. Sample Input a*b+(c-d/e)*f# Output ab*cde/-f*+ #include <stdio.h> #include <stdlib.h> char s[100005]; //分配栈的大小 int m

数据结构实验之栈:进制转换

            数据结构实验之栈:进制转换 输入一个十进制整数,将其转换成对应的R(2<=R<=9)进制数,并输出. 输入 第一行输入需要转换的十进制数:第二行输入R. 输出 输出转换所得的R进制数. 模板: while(n!=0) { mod = n%r; q[i++] = mod;//i初始化为0 n/=r; }  

数据结构实验之栈:行编辑器

数据结构实验之栈:行编辑器 题目描述 一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区. 由于用户在终端上进行输入时,不能保证不出差错,因此,若在编辑程序中,“每接受一个字符即存入用户数据区”的做法显然不是最恰当的.较好的做 法是,设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区.允许用户输入出差错,并在发现有误时可以及时更正.例如,当用户发现刚 刚键入的一个字符是错的时,可补进一个退格符"#",以表示前一个字符无效: 如果发现当前

SDUT OJ 1479 数据结构实验之栈:行编辑器

数据结构实验之栈:行编辑器 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区. 由于用户在终端上进行输入时,不能保证不出差错,因此,若在编辑程序中,“每接受一个字符即存入用户数据区”的做法显然不是最恰当的.较好的做 法是,设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区.允许用户输入出差错,并在发现有误时可以及时更正.例如,当