【问题标题】:How to get to the bottom of a stack (without losing the other elements) in Java如何在 Java 中到达堆栈底部(不丢失其他元素)
【发布时间】:2021-09-01 15:43:11
【问题描述】:

我需要通过创建 Boolean 堆栈类型来创建 BitOutputStream,然后输出“存储”在该堆栈中的字节。

package cop2805;
import java.nio.file.*;
import java.io.*;
import java.util.*;

public class BitOutputStream {
    
    Stack<Boolean> buffer;
    
    BitOutputStream(){
        buffer = new Stack<Boolean>();
    }
    public void WriteBit(char bit) {
        Path path = Paths.get("bits.bin");
        try {
            OutputStream bitOut = Files.newOutputStream(path, StandardOpenOption.CREATE,
                    StandardOpenOption.APPEND);
            BufferedOutputStream buffered =
            new BufferedOutputStream(bitOut);
            buffered.write(bit);
                     if (bit == '1') {
                         buffer.push(true);
                     }
                     else {
                         buffer.push(false);
                     }
                if (buffer.size() == 8) { //stack reaches 8 bits
                    OutputByte();
                }
        } catch (IOException e) {
            System.err.format("error: %s%n", e);
        }
    }
    public void close(){ //outputs any remaining bits in the buffer.
        byte b = 0;
        int exp = 1;
        while(!buffer.empty()) {
            buffer.pop();
            if (buffer.contains(true)) {
                b += exp;
            }
            exp *= 2;
        }
        System.out.printf("\nBytes: %d", b);
        
    }

    private void OutputByte(){
        byte b = 0;
        int exp = 1;
        while(!buffer.empty()) {
            System.out.println(buffer.pop());
             if (buffer.contains(true)) {
                 b += exp;
             }
             exp *= 2; //increase the exponent by a power of 2
        }
         System.out.printf("Bytes: %d", b);
    }
}

它运行良好,直到我必须通过堆栈并将位转换为十进制字节。因为它是从放入所述堆栈的最后一个元素开始工作的,所以输出的字节是错误的。前 8 位的字节大小应为 110(位为 0110 1110),但其输出为 63,因为它与位 0111 0110 一起使用。 有什么方法可以在不使用 pop 方法的情况下到达堆栈底部,因为这会从堆栈中删除该元素?

【问题讨论】:

  • 您可以将它们推送到另一个堆栈中,以便可以恢复它们。
  • @Scott-Hunter 嗯,好吧,例如,它类似于newStack.push(buffer.peek()); ?
  • 当你需要的是队列时,为什么还要使用堆栈?
  • @user207421 阅读答案。

标签: java boolean stack


【解决方案1】:

如果您使用 FIFO(先进先出)的队列而不是 FILO(先进后出)的堆栈,您将能够以正确的顺序读取位,而无需任何其他操作。

如果你push() 0101 到一个堆栈当你pop() 所有元素,你会得到1010

如果你add() 0101 到一个队列当你poll() 所有元素,你会得到0101

编辑:

我想我明白了为什么你的任务要求你使用堆栈。当您的程序从文件中读取时,它将从左到右读取二进制值,但从右到左读取二进制值(从最低有效位开始)。由于顺序颠倒了,因此堆栈 (FILO)是要使用的适当数据结构。

当我以 01101110 作为输入运行以下代码时,它会输出“Bytes: 110”。

byte resultByte = 0;
int exp = 1;

while(!buffer.empty()) {
    boolean bit = buffer.pop();
    if (bit)
        resultByte += exp;
    exp *= 2;
}

System.out.println("Bytes: " + resultByte);

【讨论】:

  • 是的,但是我需要为我的作业创建一个堆栈,所以我不能遗憾地使用队列。我去做了斯科特建议的工作,但字节仍然输出错误。 if (buffer.contains(true)) 是查看堆栈中的内容是否等于 true 的正确方法吗?因为通过调试,我看到在每个条件为真或假的情况下,它都会进入我的 if 语句。我在那里做错了什么? (这与我的 OutputByte 函数有关)。
猜你喜欢
  • 2022-11-01
  • 2017-09-06
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
相关资源
最近更新 更多