将元素从堆栈复制到队列
Copy Elements From Stack to Queue
我应该将元素从堆栈复制到队列。
我一直想不出一种方法来保持堆栈的原样并将其元素复制到队列中。
我最终使用了这个方法,它从堆栈中完全删除元素并将它们添加到队列中:
public void CopyFromStack(){
E t;
int c = w.size();
while(c != 0){
t = w.pop();
enqueue(t);
c--; }}
尝试将元素向后推不是一种选择,因为它会向后推。
编辑:这是包含我的方法的 class,它是我的队列 class:
public class Queue<E> {
protected int size;
protected Node<E> head;
protected Node<E> tail;
NodeStack<E> w = new NodeStack<E>();
NodeStack<E> w2 = new NodeStack<E>();
public Queue(){
size = 0;
head = tail = null;}
public boolean isEmpty(){
return size==0;}
public void enqueue(E elem) {
Node<E> node = new Node<E>();
node.setElement(elem);
node.setNext(null);
if (size == 0) head = node;
else tail.setNext(node);
tail = node;
size++; }
public E dequeue() {
if (size == 0) System.out.print("Queue is empty.");
E tmp = head.getElement();
head = head.getNext();
size--;
if (size == 0) tail = null;
return tmp; }
public String toString(){
String s = "";
E t;
int c = size;
while(c != 0){
t = dequeue();
s += t + " ";
enqueue(t);
c--; }
return s;}
public int FindItem(E elem){
int index=0;
int c = size;
E t;
while(c != 0){
t = dequeue();
if (t == elem)
return index;
else index++;
c--;}
System.out.print("Not found!");
return -1;}
public void CopyToStack(){
System.out.print("Elements copied to the stack are: ");
E t;
int c = size;
while(c != 0){
t = dequeue();
w.push(t);
enqueue(t);
c--;
System.out.print(w.pop()+" "); }}
public void CopyFromStack(){
E t;
int c = w.size();
while(c != 0){
t = w.pop();
enqueue(t);
c--; }}
问:我还没想出办法让堆栈保持原样答:
A:那是因为从 "classic" 堆栈读取是 破坏性的 。 "Reading" 一个元素 == 从堆栈中删除 该元素。
两种解决方案:
1) 修改您的堆栈实现,以便您可以 "peek" 每个元素
...或...
2) 创建一个包含第一个元素的所有元素的新堆栈。
问:我最终采用了这种方法...尝试将元素推回不是一种选择,因为它会向后推。
"A: This is a variation on "选项2):同上。
解决方案:只需创建一个 new 堆栈对象,然后 push 每个元素,同时将元素放入队列。
PS:
Stack 的标准 JRE 实现包括 peek()
和 search()
方法。但我认为他们不会在这里帮助你。如果您想要 "Option 1)",则必须实施您自己的自定义堆栈。
==================更新==================
也请注意:
您应该始终缩进您的方法,并在您的方法中缩进您的 "if" 和 "loop" 块。
您应该使用 "camel-case"(首字母小写)作为您的方法名称。
这里是 "official" Java 编码约定。它们在 1995 年很有用;它们今天很有用:
http://www.oracle.com/technetwork/java/index-135089.html
实际上有一个第三个选项:Java的"Stack"恰好实现了"iterator"。这是一个例子:
示例代码:
package com.testcopy;
import java.util.ArrayDeque;
import java.util.Iterator;
import java.util.Queue;
import java.util.Stack;
public class TestCopy {
public static void main (String[] args) {
TestCopy app = new TestCopy ();
app.run ();
}
public void run () {
// Create and populate stack
Stack<String> myStack = new Stack<String> ();
mkData(myStack);
// Copy to queue
Queue<String> myQueue = new ArrayDeque<String> ();
copyFromStack (myStack, myQueue);
// Print
int i=0;
for (String s : myQueue) {
System.out.println ("myQueue[" + i++ + "]: " + s);
}
}
@SuppressWarnings("unchecked")
public void mkData (Stack stack) {
stack.push("A");
stack.push("B");
stack.push("C");
// Stack should now contain C, B, A
}
public void copyFromStack (Stack stack, Queue queue) {
@SuppressWarnings("rawtypes")
Iterator it = stack.iterator ();
while (it.hasNext()) {
queue.add(it.next());
}
}
}
示例输出:
myQueue[0]: A
myQueue[1]: B
myQueue[2]: C
我应该将元素从堆栈复制到队列。
我一直想不出一种方法来保持堆栈的原样并将其元素复制到队列中。
我最终使用了这个方法,它从堆栈中完全删除元素并将它们添加到队列中:
public void CopyFromStack(){
E t;
int c = w.size();
while(c != 0){
t = w.pop();
enqueue(t);
c--; }}
尝试将元素向后推不是一种选择,因为它会向后推。
编辑:这是包含我的方法的 class,它是我的队列 class:
public class Queue<E> {
protected int size;
protected Node<E> head;
protected Node<E> tail;
NodeStack<E> w = new NodeStack<E>();
NodeStack<E> w2 = new NodeStack<E>();
public Queue(){
size = 0;
head = tail = null;}
public boolean isEmpty(){
return size==0;}
public void enqueue(E elem) {
Node<E> node = new Node<E>();
node.setElement(elem);
node.setNext(null);
if (size == 0) head = node;
else tail.setNext(node);
tail = node;
size++; }
public E dequeue() {
if (size == 0) System.out.print("Queue is empty.");
E tmp = head.getElement();
head = head.getNext();
size--;
if (size == 0) tail = null;
return tmp; }
public String toString(){
String s = "";
E t;
int c = size;
while(c != 0){
t = dequeue();
s += t + " ";
enqueue(t);
c--; }
return s;}
public int FindItem(E elem){
int index=0;
int c = size;
E t;
while(c != 0){
t = dequeue();
if (t == elem)
return index;
else index++;
c--;}
System.out.print("Not found!");
return -1;}
public void CopyToStack(){
System.out.print("Elements copied to the stack are: ");
E t;
int c = size;
while(c != 0){
t = dequeue();
w.push(t);
enqueue(t);
c--;
System.out.print(w.pop()+" "); }}
public void CopyFromStack(){
E t;
int c = w.size();
while(c != 0){
t = w.pop();
enqueue(t);
c--; }}
问:我还没想出办法让堆栈保持原样答:
A:那是因为从 "classic" 堆栈读取是 破坏性的 。 "Reading" 一个元素 == 从堆栈中删除 该元素。
两种解决方案:
1) 修改您的堆栈实现,以便您可以 "peek" 每个元素
...或...
2) 创建一个包含第一个元素的所有元素的新堆栈。
问:我最终采用了这种方法...尝试将元素推回不是一种选择,因为它会向后推。
"A: This is a variation on "选项2):同上。
解决方案:只需创建一个 new 堆栈对象,然后 push 每个元素,同时将元素放入队列。
PS:
Stack 的标准 JRE 实现包括 peek()
和 search()
方法。但我认为他们不会在这里帮助你。如果您想要 "Option 1)",则必须实施您自己的自定义堆栈。
==================更新==================
也请注意:
您应该始终缩进您的方法,并在您的方法中缩进您的 "if" 和 "loop" 块。
您应该使用 "camel-case"(首字母小写)作为您的方法名称。
这里是 "official" Java 编码约定。它们在 1995 年很有用;它们今天很有用:
http://www.oracle.com/technetwork/java/index-135089.html
实际上有一个第三个选项:Java的"Stack"恰好实现了"iterator"。这是一个例子:
示例代码:
package com.testcopy;
import java.util.ArrayDeque;
import java.util.Iterator;
import java.util.Queue;
import java.util.Stack;
public class TestCopy {
public static void main (String[] args) {
TestCopy app = new TestCopy ();
app.run ();
}
public void run () {
// Create and populate stack
Stack<String> myStack = new Stack<String> ();
mkData(myStack);
// Copy to queue
Queue<String> myQueue = new ArrayDeque<String> ();
copyFromStack (myStack, myQueue);
// Print
int i=0;
for (String s : myQueue) {
System.out.println ("myQueue[" + i++ + "]: " + s);
}
}
@SuppressWarnings("unchecked")
public void mkData (Stack stack) {
stack.push("A");
stack.push("B");
stack.push("C");
// Stack should now contain C, B, A
}
public void copyFromStack (Stack stack, Queue queue) {
@SuppressWarnings("rawtypes")
Iterator it = stack.iterator ();
while (it.hasNext()) {
queue.add(it.next());
}
}
}
示例输出:
myQueue[0]: A
myQueue[1]: B
myQueue[2]: C