数据结构java版之 栈的应用<一>

上一篇我们自定义了栈和队列。本篇使用栈结构来完成一个功能,看看他的应用。会分两篇讲解。本篇需求:设计一个栈结构,实现字符串的反转,字符串不包括汉子。


过程如下,因为代码做了很详细的解释。没有必要再去讲解代码的细节了。

1、自定义栈结构

package stacktest;

/**
 * 需求:使用栈结构,实现单词逆序
 * 
 * @author Howard 使用栈完成,字符串倒叙
 */
public class MyStack {
    //记录数组大小
    private int arrSize;
    //底层使用数组
    private char[] charArray;
    //定义头指针
    private int top;

    public MyStack(int arrSize) {
        this.arrSize = arrSize;
        charArray = new char[arrSize];
        top = -1;
    }

    /**
     * 压栈,存储数据
     * @param value
     */
    public void push(char value){
        charArray[++top] = value;
    }

    /**
     * 出栈
     * @return
     */
    public char pop(){
        return charArray[top--];
    }

    /**
     * 判断是否空
     * @return
     */
    public boolean isEmpty(){
        return top == -1;
    }

    /**
     * 判断是否满栈
     * @return
     */
    public boolean isFull(){
        return top == arrSize;
    }

    /**
     * 查看当前栈顶数据
     * @return
     */
    public char peek(){
        return charArray[top];
    }
}

2、定义反转功能的类,但是底层使用上边自定义的栈结构实现:

package stacktest;
/**
 * 用于反转作用的工具类
 * @author Howard
 *      底层使用栈结构
 *思路:
 *      先把数据存入栈,再依次弹出栈并做拼接
 */
public class Reverse {
    //输入的字符串
    private String input;
    //输出的反转后的字符串
    private String result;
    //字符串的长度
    private int strSize;

    public Reverse(String input){
        this.input = input;
        strSize = input.length();
        result = "";
    }

    /**
     * 做字符串反转功能
     * @return
     */
    public String doReverse(){
        //初始化栈有多大,跟字符串长度一样
        MyStack myStack = new MyStack(strSize);
        for (int i = 0; i < strSize; i++) {
            //把字符串 “抛开”,每个字符都压栈
            myStack.push(input.charAt(i));
        }

        //弹栈,并把每次弹出的单个字符进行依次拼接
        while(!myStack.isEmpty()){
            char c = myStack.pop();
            result += c;
        }

        return result;
    }
}

3、测试功能:

package stacktest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

/**
 * 测试功能
 * @author Howard
 *
 */
public class TestReverse {
    public static void main(String[] args) {
        //键盘录入数据。使用转换流
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        while(true){
            System.out.println("请输入字符串:");
            try {
                String inputStr = reader.readLine();

                if(inputStr.equals("")){
                    //输入空串,跳出循环
                    break;
                }

                //拿到自定义的反转功能实例
                Reverse reverse = new Reverse(inputStr);
                String result = reverse.doReverse();
                System.out.println("反转后的数据为:"+result);

            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        System.out.println("结束反转");

    }
}

欢迎关注本公众号,一起交流Android、java、设计模式等知识~


控制台输入输出如下:

请输入字符串:

abc

反转后的数据为:cba

请输入字符串:

ABC

反转后的数据为:CBA

请输入字符串:

%^*

反转后的数据为:*^%

请输入字符串:


结束反转


喜欢我的朋友可以关注公众号,最早通知博客更新,还有其他的文章。值得阅读


微信搜索公众号    codeHoward    即可。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值