【发布时间】: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 阅读答案。