实现一个栈。
操作:
- push x:将 加x x 入栈,保证 x x 为 int 型整数。
- pop:输出栈顶,并让栈顶出栈
- top:输出栈顶,栈顶不出栈
输入描述:
第一行为一个正整数 n n ,代表操作次数。(1≤n≤100000)(1≤n≤100000)接下来的 n n ,每行为一个字符串,代表一个操作。保证操作是题目描述中三种中的一种。
输出描述:
如果操作为push,则不输出任何东西。如果为另外两种,若栈为空,则输出 "error“否则按对应操作输出。
栈的特点:
- 先入后出
可以使用的数据结构:
- 数组
- 队列
- list集合
- 链表
- stack
使用数组实现:
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int i = in.nextInt();
MyStack myStack = new MyStack(i);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String next = in.nextLine();
if (next.startsWith("push")) {
myStack.push(Integer.parseInt(next.substring(next.indexOf(" ") + 1)));
} else if (next.startsWith("top")) {
System.out.println(myStack.top());
} else if (next.startsWith("pop")) {
System.out.println(myStack.pop());
}
}
}
}
class MyStack {
int[] data;
// 当前栈顶指针
int top = 0;
int dataSize;
int size = 0 ;//栈中元素个数
public MyStack(int size) {
dataSize = size;
data = new int[size];
}
public void push(int num) {
if(this.size == this.dataSize) {//元素的个数已经达到栈的最大容量,不允许存储,报错
System.out.println("error") ;
} else {
data[top++] = num ;//在栈顶指针的位置增加新元素,栈顶指针更新+1
this.size++ ;//栈中元素个数更新+1
}
}
public String pop() {
if (top == 0) {
return "error";
}
return String.valueOf(data[--top]);
}
public String top() {
if (top == 0) {
return "error";
}
return String.valueOf(data[top-1]);
}
}
使用队列实现:
public static void main(String[] args) {
Deque<Integer> queue = new LinkedList<Integer>();//双向链表
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String str;
while (n-- > 0) {
str = sc.next();
if ("push".equals(str)) {
int t = sc.nextInt();
queue.push(t);
} else if ("pop".equals(str)) {
if (queue.isEmpty()) {
System.out.println("error");
} else {
System.out.println(queue.peek());
queue.pop();
}
} else if ("top".equals(str)) {
if (queue.isEmpty()) {
System.out.println("error");
} else
System.out.println(queue.peek());
}
}
}
使用list集合实现
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
int n = Integer.parseInt(in.nextLine());
List<Integer> list = new ArrayList<>();
while(n-- > 0){
String line = in.nextLine();
String[] splits = line.split(" ");
if("push".equals(splits[0])){
list.add(Integer.parseInt(splits[1]));
} else if(list.isEmpty()){
System.out.println("error");
} else {
System.out.println(list.get(list.size() - 1));
if("pop".equals(splits[0])){
list.remove(list.size() - 1);
}
}
}
}
}