问题 J: 数据结构基础10-洗盘子

本文描述了一个关于小明和小苏合作洗盘子并保持擦干顺序的问题,通过栈操作模拟洗盘子和擦干的过程,最后输出擦干后盘子的正确顺序。
摘要由CSDN通过智能技术生成

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]);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值