1.小邋遢的衣橱
题目描述的是一个**栈(Stack)**结构:
in name:表示把一件衣服name放入箱子(压入栈顶)。out name:表示取出名字为name的衣服 ,但注意:- 只能从栈顶开始拿;
- 拿的时候会把这件衣服上面的所有衣服都拿出来 (即弹出),直到找到
name; - 找到后,这件衣服也拿走(不放回去);
- 被拿出来的其他衣服(在它上面的)就丢掉了?还是放回去?
但从样例来看,我们可以推断:
当执行
out name时,从栈顶开始弹出,直到找到第一个name,然后停止。所有被弹出的衣服(包括name)都不再放回栈中。
也就是说:这是一个"从栈中移除第一次出现的指定元素(从顶部往下找),并同时移除它上面的所有元素"的操作。
这其实不是标准栈的操作,但可以模拟。
用一个列表(模拟栈)来存储衣服。
对每条指令:
- 如果是
in name:直接 加到列表末尾。 - 如果是
out name:- 从后往前遍历(即从栈顶向下)找第一个等于
name的元素。 - 找到位置
i后,保留前 i 个元素(0 到 i-1),通过top=idx将后面的(包括 i)全部丢弃。
- 从后往前遍历(即从栈顶向下)找第一个等于
最后:
- 如果栈非空,输出最后一个元素(name[top-1])
- 否则输出 "Empty"
cpp
#include <stdio.h>
#include <string.h>
int main() {
int n;
scanf("%d",&n);
char name[n][100];
char str[100];
char p[5];
int top=0;
for(int i=0;i<n;i++){
scanf("%s %s",p,str);
if(strcmp(p,"in")==0){
strcpy(name[top],str);
top++;
}
else if(strcmp(p,"out")==0){
int idx=-1;
for(int j=top-1;j>=0;j--){
if(strcmp(name[j],str)==0){
idx=j;
break;
}
}
if (idx != -1) {
top = idx;
}
}
}
if(top==0){
printf("Empty\n");
}
else{
printf("%s",name[top-1]);
}
return 0;
}
2.模拟栈
cpp
#include <stdio.h>
#include <string.h>
int main() {
int m;
scanf("%d",&m);
int top=0;
char p[10];
int stack[1000000];
for(int i=0;i<m;i++){
scanf("%s",p);
if(strcmp(p,"push")==0){
int x;
scanf("%d",&x);
stack[top]=x;
top++;//top为元素个数
}
else if(strcmp(p,"pop")==0&&top!=0){
top--;
}
else if(strcmp(p,"empty")==0){
if(top){
printf("NO\n");
}else{
printf("YES\n");
}
}
else if(strcmp(p,"query")==0){
if(top!=0){
printf("%d\n",stack[top-1]);
}else{
printf("empty\n");
}
}
}
return 0;
}