目的

用数组模拟栈的实现

问题描述

AcWing 828. 模拟栈
实现一个栈,栈初始为空,支持四种操作:

  1. push x – 向栈顶插入一个数 x;
  2. pop – 从栈顶弹出一个数;
  3. empty – 判断栈是否为空;
  4. query – 查询栈顶元素。

现在要对栈进行 M 个操作,其中的每个操作 3 和操作 4 都要输出相应的结果。
输入格式
第一行包含整数 M,表示操作次数。
接下来 M 行,每行包含一个操作命令,操作命令为 push xpopemptyquery 中的一种。
输出格式
对于每个 emptyquery 操作都要输出一个查询结果,每个结果占一行。
其中,empty 操作的查询结果为 YESNOquery 操作的查询结果为一个整数,表示栈顶元素的值。
数据范围
1≤M≤100000
1≤x≤109
所有操作保证合法。
输入样例:

  1. 10
  2. push 5
  3. query
  4. push 6
  5. pop
  6. query
  7. pop
  8. empty
  9. push 4
  10. query
  11. empty

输出样例:

  1. 5
  2. 5
  3. YES
  4. 4
  5. NO

方法

  1. 开辟合适大小的数组
  2. 初始化 ```java static int N = 100010; //视具体问题而定

//初始化 int[] stack = new int[N]; int top = -1; //top为栈顶指针,初始指向-1表示栈为空

  1. ```java
  2. import java.util.*;
  3. import java.io.*;
  4. public class Main {
  5. static int N = 100010;
  6. public static void main(String[] sss) throws IOException{
  7. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  8. BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
  9. int m = Integer.parseInt(br.readLine());
  10. int[] stack = new int[N];
  11. int top = -1;
  12. while (m-- > 0) {
  13. String[] str = br.readLine().split(" ");
  14. int x;
  15. switch(str[0]) {
  16. case "push":
  17. x = Integer.parseInt(str[1]);
  18. stack[++top] = x;
  19. break;
  20. case "pop":
  21. if (top > -1) top--;
  22. break;
  23. case "empty":
  24. if (top > -1) bw.write("NO\n");
  25. else bw.write("YES\n");
  26. break;
  27. case "query":
  28. if (top > -1) {
  29. x = stack[top];
  30. bw.write(x + "\n");
  31. }
  32. break;
  33. default:
  34. }
  35. }
  36. br.close();
  37. bw.close();
  38. }
  39. }

注意

BufferedReaderwrite 方法在输出int型时将他看成字符就很扯,把它转成字符串再输出就ok了

  1. BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
  2. writer.write(97);
  3. writer.write(97 + "");
  4. writer.close();

image.png