蓝桥杯备赛2-1

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;
}
相关推荐
wfbcg5 小时前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
yoyobravery6 小时前
蓝桥杯第15届单片机满分
单片机·职场和发展·蓝桥杯
June bug6 小时前
全链路测试
功能测试·面试·职场和发展
倦王7 小时前
力扣日刷47
算法·leetcode·职场和发展
The_era_achievs_hero7 小时前
产品360度展示(蓝桥杯)
蓝桥杯
abant28 小时前
leetcode 239 单调队列 需要一些记忆
算法·leetcode·职场和发展
2301_8090494210 小时前
HAL库速成--嵌入式赛道--蓝桥杯速成
职场和发展·蓝桥杯
打瞌睡的朱尤10 小时前
4.1蓝桥杯训练
职场和发展·蓝桥杯
Little At Air10 小时前
LeetCode 30. 串联所有单词的子串 | 困难 C++实现
算法·leetcode·职场和发展
a里啊里啊11 小时前
常见面试题目集合
linux·数据库·c++·面试·职场和发展·操作系统