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



我需要通过创建一个Stack类型的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方法的情况下到达堆栈的底部,因为这会从堆栈中删除该元素?

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

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

如果您在poll()所有元素时add()0101到一个队列,您将获得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);

最新更新