如何在 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);
我需要通过创建一个 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);