题解 | #【模板】栈的操作#

【模板】栈的操作

https://www.nowcoder.com/practice/cdf02ea916454957b575585634e5773a

题目链接

【模板】栈的操作

题目描述

你需要模拟一个整数栈的四种基本操作:

  1. push x: 将整数 x 压入栈顶。
  2. pop: 弹出栈顶元素。如果栈为空,则输出 "Error"。
  3. query: 查询栈顶元素。如果栈为空,则输出 "Empty"。
  4. size: 输出栈中当前元素的数量。

输入格式 第一行是一个整数 n,表示操作的总次数。 接下来 n 行,每行是一个操作指令。

输出格式 根据操作指令,按顺序输出相应的结果,每个结果占一行。

解题思路

本题是数据结构中的经典问题,旨在熟悉"栈"(Stack)这一后进先出(Last-In, First-Out, LIFO)的数据结构。几乎所有现代编程语言的标准库都内置了高效的栈实现,我们直接使用即可。

  1. 选择数据结构:

    • C++: std::stack
    • Java: java.util.ArrayDeque (官方推荐,比 java.util.Stack 更高效) 或 java.util.Stack
    • Python: list 类型可以非常方便地作为栈来使用。
  2. 主程序逻辑:

    • 读入操作总数 n
    • 实例化一个栈对象。
    • 进入一个循环,执行 n 次。
    • 在循环中,读取每一行的操作命令(如 "push", "pop" 等)。
  3. 分发操作: 使用 if-elseswitch 语句根据读取到的命令字符串执行相应的栈操作:

    • push x: 读取命令 "push" 及其后的整数 x,调用栈的压入方法(push() / append())将 x 入栈。
    • pop:
      • 关键: 在执行 pop 操作前,必须检查栈是否为空(empty() / isEmpty() / if not stack:)。
      • 如果栈不为空,则调用弹出方法(pop())。
      • 如果栈为空,则按题目要求输出 "Empty"。
    • query:
      • 同样,必须先检查栈是否为空。
      • 如果栈不为空,则调用查询栈顶方法(top() / peek() / stack[-1])并输出结果。
      • 如果栈为空,则按题目要求输出 "Empty"。
    • size: 直接调用获取大小的方法(size() / len())并输出结果。

这个流程直接模拟了题目的要求,核心在于正确使用所选语言的栈API,并细心处理空栈的边界条件。

代码

#include <iostream>
#include <stack>
#include <string>

using namespace std;

int main() {
    int n;
    cin >> n;
    
    stack<int> s;
    string command;
    
    for (int i = 0; i < n; ++i) {
        cin >> command;
        if (command == "push") {
            int x;
            cin >> x;
            s.push(x);
        } else if (command == "pop") {
            if (s.empty()) {
                cout << "Empty" << endl;
            } else {
                s.pop();
            }
        } else if (command == "query") {
            if (s.empty()) {
                cout << "Empty" << endl;
            } else {
                cout << s.top() << endl;
            }
        } else if (command == "size") {
            cout << s.size() << endl;
        }
    }
    
    return 0;
}
import java.util.Scanner;
import java.util.ArrayDeque;
import java.util.Deque;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        Deque<Integer> stack = new ArrayDeque<>();
        
        for (int i = 0; i < n; i++) {
            String command = sc.next();
            
            switch (command) {
                case "push":
                    int x = sc.nextInt();
                    stack.push(x);
                    break;
                case "pop":
                    if (stack.isEmpty()) {
                        System.out.println("Empty");
                    } else {
                        stack.pop();
                    }
                    break;
                case "query":
                    if (stack.isEmpty()) {
                        System.out.println("Empty");
                    } else {
                        System.out.println(stack.peek());
                    }
                    break;
                case "size":
                    System.out.println(stack.size());
                    break;
            }
        }
    }
}
def main():
    n = int(input())
    stack = []
    
    for _ in range(n):
        line = input().split()
        command = line[0]
        
        if command == "push":
            x = int(line[1])
            stack.append(x)
        elif command == "pop":
            if not stack:
                print("Empty")
            else:
                stack.pop()
        elif command == "query":
            if not stack:
                print("Empty")
            else:
                print(stack[-1])
        elif command == "size":
            print(len(stack))

if __name__ == "__main__":
    main()

算法及复杂度

  • 算法: 基于标准库的栈进行模拟。
  • 时间复杂度: ,其中 是操作的总次数。每一次 push, pop, query(top), size 操作的摊销时间复杂度都是
  • 空间复杂度: 。在最坏的情况下(例如,所有操作都是 push),栈中会存储 个元素,因此空间复杂度与操作数成正比。
全部评论

相关推荐

Ncsbbss:又想干活又想要工资,怎么什么好事都让你占了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务