p.s.个人自用
题目描述
小明和小苏将联手洗N个脏盘子。小明负责洗盘子,小苏负责擦干它们。每个盘子有一个指定的编号,范围为1~N。开始时,所有盘子按顺序排列在栈中,1号盘子在顶端,N号盘子在底端。小明会先洗定些盘子,然后放在洗过的盘子栈里(使原来的顺序颠倒)。然后,小苏擦干小明已经洗好的部分或全部的盘子,放在擦干的盘子栈里。然后,小明再洗一些盘子,小苏再擦干一些她已经洗好的盘子,直到所有盘子洗完擦干。这时盘子放置的顺序是什么?比如,有1,2,3,4,5号盘子,先洗3个,然后擦2个,再洗2个,再擦3个。最后盘子的序列是1,4,5,2,3。
输入
第一行一个正整数N,表示盘子的数量,1<=N<=10000
以下若干行:每行两个整数,第一个数为1表示洗盘子,为2表示擦盘子,第二个数表示数量;
输出
共N行,每行一个数,表示擦干后盘子从顶端到底端的顺序;
样例输入 Copy
5 1 3 2 2 1 2 2 3
样例输出 Copy
1 4 5 2 3
答案
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[20000] = { 0 };//擦干后的盘子
typedef struct sstack {
int data;
struct sstack* next;
}mystack;
mystack* init()//初始化
{
mystack* top = (mystack*)malloc(sizeof(mystack));
if (top != NULL)
top->next = NULL;
return top;
}
void ppush(mystack* top, int k)//入栈
{
mystack* s = (mystack*)malloc(sizeof(mystack));
if (s != NULL)
{
s->next = top->next;
s->data = k;
top->next = s;
}
}
void ppop(mystack* top)//出栈
{
if (top->next != NULL)//判空
{
mystack* s = top->next;
top->next = s->next;
free(s);
s = NULL;
}
}
int main()
{
int n;//盘子总数
scanf("%d", &n);
int x = 0;//洗好的盘子数
int y = 0;//擦干的盘子数
int c, num;//选择1/2,盘子数
mystack* top = init();
while (y < n)
{
scanf("%d%d", &c, &num);
if (c == 1)
{
while (num--)
{
ppush(top, ++x);
}
}
if (c == 2)
{
while (num--)
{
a[++y] = top->next->data;
ppop(top);
}
}
}
for (int i = n; i > 0; i--)
printf("%d\n", a[i]);
}