栈算法题详解412

本文介绍了如何使用Java实现一个栈类,包括push(入栈)方法将int型整数入栈,pop(出栈)方法输出并移除栈顶元素,以及top(查看栈顶)方法不移除元素。实例展示了如何处理用户输入并执行栈操作。
摘要由CSDN通过智能技术生成

请你实现一个栈。

操作:
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,但实际上由于之后再没有数据了,所以会在读取输入流的时候发生异常,从而导致整个运行报错.

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值