请你实现一个栈。
操作:
push x:将 x 入栈,保证x 为 int 型整数。
pop:输出栈顶,并让栈顶出栈
top:输出栈顶,栈顶不出栈
如果操作为push,则不输出任何东西。
如果为另外两种,若栈为空,则输出 "error“
否则按对应操作输出。
import java.util.Scanner;
class Stack{
//保存元素
int[] data;
//栈中的元素个数
int size = 0;
//栈的最大容量
int maxSize;
//栈顶
int top = 0;
//构造器
public Stack(int maxSize){
this.maxSize = maxSize;
this.data = new int[maxSize];
}
//压栈
public void push(int val){
if(this.size == this.maxSize){
//栈满输出error
System.out.println("error");
}else{
//栈不满,将元素入栈,栈顶指针上移
data[top++] = val;
//栈中元素个数加一
this.size++;
}
}
//出栈
public void pop(){
if(this.size == 0){
//栈空,输出error
System.out.println("error");
}else{
//出栈,栈顶下移
System.out.println(data[--top]);
//栈中元素个数减一
this.size--;
}
}
//栈顶元素
public void top(){
if(this.size == 0){
//栈空,输出error
System.out.println("error");
}else{
//打印栈顶元素
System.out.println(data[top-1]);
}
}
}
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
//保证n为int类型
int n = Integer.parseInt(in.nextLine());
Stack s = new Stack(n);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String str = in.nextLine();
//将数据已空格切片,存入数组
String arr[] = str.split(" ");
if(arr[0].equals("push")){
s.push(Integer.parseInt(arr[1]));
}else if(arr[0].equals("pop")){
s.pop();
}else{
s.top();
}
}
}
}
integer.parseint()
integer.parseint()是将整型数据Integer转换为基本数据类型int
split()
split()是一个用来切分字符串的函数
//语法 regex--正则表达式分隔符 limit--分割的份数。
public String[] split(String regex, int limit)
示例:
public class Test {
public static void main(String args[]) {
String str = new String("Welcome-to-Runoob");
System.out.println("- 分隔符返回值 :" );
for (String retval: str.split("-")){
System.out.println(retval);
}
System.out.println("");
System.out.println("- 分隔符设置分割份数返回值 :" );
for (String retval: str.split("-", 2)){
System.out.println(retval);
}
System.out.println("");
String str2 = new String("www.runoob.com");
System.out.println("转义字符返回值 :" );
for (String retval: str2.split("\\.", 3)){
System.out.println(retval);
}
System.out.println("");
String str3 = new String("acount=? and uu =? or n=?");
System.out.println("多个分隔符返回值 :" );
for (String retval: str3.split("and|or")){
System.out.println(retval);
}
}
}
//输出
/*
- 分隔符返回值 :
Welcome
to
Runoob
- 分隔符设置分割份数返回值 :
Welcome
to-Runoob
转义字符返回值 :
www
runoob
com
多个分隔符返回值 :
acount=?
uu =?
n=?
*/
hasNext 和 hasNextLine 的区别
- hasNext()方法会判断接下来是否有非空字符.如果有,则返回true,否则返回false
- hasNextLine() 方法会根据行匹配模式去判断接下来是否有一行(包括空行),如果有,则返回true,否则返回false
比如当前我们有如下测试用例:
6 1 3 8\n
这个测试用例在牛客网上是以文件的形式进行存储的.
而在 linux 系统中文件的结尾会有一个换行符\n,也就是说从System.in输入流中真正读取到的数据流是这样的:
6 1 3 8\n
程序在处理完5之后,输入流中就只剩下一个换行符\n了,在处理完5之后while再去进行循环判断,此时hasNext()方法和hasNextLine()方法去判断得到的结果就产生了差异.
hasNext()方法会认为之后再没有非空字符,会返回一个false
hasNextLine() 方法会认为换行符\n是一个空行,符合行的匹配模式,则会返回一个true,但实际上由于之后再没有数据了,所以会在读取输入流的时候发生异常,从而导致整个运行报错.