模拟栈push、top、pop

实现一个栈。 

 操作: 

  • 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);
}
}
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

91老码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值