如何在 Java 中到达堆栈底部(不丢失其他元素)

How to get to the bottom of a stack (without losing the other elements) in Java

我需要通过创建一个 Stack 类型的布尔值来创建一个 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),但由于它使用位 0111 0110,因此输出 63。 有什么方法可以在不使用 pop 方法的情况下到达堆栈底部,因为这会从堆栈中删除该元素?

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

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

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

编辑:

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

当我 运行 以下代码以 01101110 作为输入时,它会按预期输出“字节数: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);