蓝桥杯备赛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;
}
相关推荐
iAkuya3 小时前
(leetcode)力扣100 61分割回文串(回溯,动归)
算法·leetcode·职场和发展
VT.馒头4 小时前
【力扣】2695. 包装数组
前端·javascript·算法·leetcode·职场和发展·typescript
源代码•宸4 小时前
大厂技术岗面试之谈薪资
经验分享·后端·面试·职场和发展·golang·大厂·职级水平的薪资
马猴烧酒.5 小时前
【面试八股|JVM虚拟机】JVM虚拟机常考面试题详解
jvm·面试·职场和发展
iAkuya6 小时前
(leetcode)力扣100 62N皇后问题 (普通回溯(使用set存储),位运算回溯)
算法·leetcode·职场和发展
HY小宝F12 小时前
职场沟通的深层智慧:从对抗到协作的自我修炼
职场和发展
AI职业加油站13 小时前
职业提升之路:我的大数据分析师学习与备考分享
大数据·人工智能·经验分享·学习·职场和发展·数据分析
_OP_CHEN13 小时前
【算法基础篇】(五十六)容斥原理指南:从集合计数到算法实战,解决组合数学的 “重叠难题”!
算法·蓝桥杯·c/c++·组合数学·容斥原理·算法竞赛·acm/icpc
草履虫建模20 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础