描述
请你实现一个加强版的栈,支持以下操作:
push x: 向栈顶加入一个整数x
pop: 从栈顶弹出一个整数,并且输出该整数
inc k x: 将处于栈底的前k个整数加x。
输入
第一行包含一个整数N,代表操作的数量。
以下N行每行一条操作。
1 ≤ N ≤ 200000, 0 ≤ x ≤ 100000, 1 ≤ k ≤ 当前栈的大小
输出
对于每一个pop操作,输出弹出的整数数值。
样例输入
6
push 1
inc 1 2
push 2
inc 2 2
pop
pop
样例输出
4
5
个人觉得该题不适合用Java来写(TLE....),一看到题目就想用栈来实现,inc函数用栈来实现就是借助一个辅助栈,把栈中所有元素出栈进入辅助栈中,在从辅助栈中出栈把前k个数都加上x在压回原来栈中,然而在oj上一跑就超时了,虽然超时我觉得思路还是有价值的,在附上用Java的链表模拟栈的结构,读者参考一下自己区分一下吧
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;
public class Main {
static ArrayList<Integer> ans = new ArrayList<Integer>();
static ArrayList<Integer> ans2 = new ArrayList<Integer>();
public static void main(String[] args) {
Stack<Integer> stack = new Stack<Integer>();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for(int i = 0; i < n; i++) {
String s = sc.next();
if(s.equals("push")) {
int temp = sc.nextInt();
//push(temp, stack);
ans.add(0, temp);
}
if(s.equals("pop")) {
//pop(stack);
ans2.add(ans.get(0));
ans.remove(0);
}
if(s.equals("inc")) {
int k = sc.nextInt();
int num = sc.nextInt();
//inc(k, num, stack);
for(int j = 0; j < k; j++) {
ans.set(ans.size() - j - 1,
ans.get(ans.size() - j - 1) + num);
}
}
}
for (Integer e : ans2) {
System.out.println(e);
}
}
private static void pop(Stack<Integer> stack) {
if(!stack.isEmpty())
ans.add(stack.pop());
}
/**
* 栈底的k个元素都加上num
* 出栈 进新栈,在出新栈前k个元素都加num,进栈结束
* @param k
* @param num
* @param stack
*/
private static void inc(int k, int num, Stack<Integer> stack) {
Stack<Integer> help = new Stack<Integer>();
while(!stack.isEmpty()) {
help.push(stack.pop());
}
for(int i = 0; i < k; i++) {
stack.push(help.pop() + num);
}
while(!help.isEmpty()) {
stack.push(help.pop());
}
}
private static void push(int temp, Stack<Integer> stack) {
stack.push(temp);
}
}
网友评论