Java 如何创建一个可以存储队列或堆栈的变量?
我有一个对象,它有一个变量,我希望它能够容纳队列或堆栈。任何具有适当逻辑的add和remove。我认为这可以通过一个接口来实现,但是Java 如何创建一个可以存储队列或堆栈的变量?,java,interface,Java,Interface,我有一个对象,它有一个变量,我希望它能够容纳队列或堆栈。任何具有适当逻辑的add和remove。我认为这可以通过一个接口来实现,但是java.util中的两个接口甚至两个操作的名称都不相同 我现在的计划是创建一个包装,使他们适合我想要的,但这似乎不雅观。有更好的办法吗 我想要像这样的东西: Something<E> steps; Something步骤; 这样,我就可以调用step.pop()和step.push()或任何方法名,而不必知道steps是否实现了队列逻辑或堆栈逻辑。
java.util
中的两个接口甚至两个操作的名称都不相同
我现在的计划是创建一个包装,使他们适合我想要的,但这似乎不雅观。有更好的办法吗
我想要像这样的东西:
Something<E> steps;
Something步骤;
这样,我就可以调用step.pop()和step.push()或任何方法名,而不必知道steps是否实现了队列逻辑或堆栈逻辑。您可能需要或者根据您的需要
两者都实现(双端队列)
从ArrayDeque
上的Javadoc中可以看出:“当用作堆栈时,该类可能比Stack快,当用作队列时,可能比LinkedList快。”
可以从Deque
的任一端添加或删除元素
Deque
可以通过调用addLast
和removeFirst
用作队列,也可以通过使用addLast
和removeLast
由堆栈使用
如果您确实希望它的行为与其中任何一个类似,则可以保留布尔标志并编写帮助器方法,或者编写一个类:
public class QueueOrStack<E> implements Iterable<E> {
private Deque<E> container = new ArrayDeque<E>();
private boolean isQueue;
public QueueOrStack(boolean isQueue) {
this.isQueue = isQueue;
}
public E pop() {
return isQueue ? container.removeFirst() : container.removeLast();
}
public void push(E element) {
container.addLast(element);
}
public void pushAll(E... element) {
for (E e : element)
container.addLast(e);
}
public boolean isQueue() {
return isQueue;
}
public void setQueue(boolean isQueue) {
this.isQueue = isQueue;
}
public boolean toggleQueue() {
return isQueue = !isQueue;
}
@Override
public Iterator<E> iterator() {
return container.iterator();
}
}
public类QueueOrStack实现Iterable{
private Deque container=new ArrayDeque();
私有布尔队列;
公共队列堆栈(布尔isQueue){
this.isQueue=isQueue;
}
公共E-pop(){
返回isQueue?container.removeFirst():container.removeLast();
}
公共无效推送(E元素){
container.addLast(元素);
}
公共无效pushAll(E…元素){
for(E:元素)
容器。addLast(e);
}
公共布尔值isQueue(){
返回isQueue;
}
公共void setQueue(布尔值isQueue){
this.isQueue=isQueue;
}
公共布尔切换队列(){
返回isQueue=!isQueue;
}
@凌驾
公共迭代器迭代器(){
返回container.iterator();
}
}
以下是测试:
QueueOrStack<String> strings = new QueueOrStack<>(true);
strings.pushAll("hello", ", " , "world\n");
for(String s : strings)
System.out.print(s); //"hello, world"
System.out.println(strings.pop()); //"hello"
strings.toggleQueue();
System.out.println(strings.pop()); //"world"
QueueOrStack字符串=新的QueueOrStack(true);
pushAll(“hello”、“,”和“world\n”);
用于(字符串s:字符串)
系统输出打印//“你好,世界”
System.out.println(strings.pop())//“你好”
strings.toggleQueue();
System.out.println(strings.pop())//“世界”
您可能需要或根据您的需要选择
两者都实现(双端队列)
从ArrayDeque
上的Javadoc中可以看出:“当用作堆栈时,该类可能比Stack快,当用作队列时,可能比LinkedList快。”
可以从Deque
的任一端添加或删除元素
Deque
可以通过调用addLast
和removeFirst
用作队列,也可以通过使用addLast
和removeLast
由堆栈使用
如果您确实希望它的行为与其中任何一个类似,则可以保留布尔标志并编写帮助器方法,或者编写一个类:
public class QueueOrStack<E> implements Iterable<E> {
private Deque<E> container = new ArrayDeque<E>();
private boolean isQueue;
public QueueOrStack(boolean isQueue) {
this.isQueue = isQueue;
}
public E pop() {
return isQueue ? container.removeFirst() : container.removeLast();
}
public void push(E element) {
container.addLast(element);
}
public void pushAll(E... element) {
for (E e : element)
container.addLast(e);
}
public boolean isQueue() {
return isQueue;
}
public void setQueue(boolean isQueue) {
this.isQueue = isQueue;
}
public boolean toggleQueue() {
return isQueue = !isQueue;
}
@Override
public Iterator<E> iterator() {
return container.iterator();
}
}
public类QueueOrStack实现Iterable{
private Deque container=new ArrayDeque();
私有布尔队列;
公共队列堆栈(布尔isQueue){
this.isQueue=isQueue;
}
公共E-pop(){
返回isQueue?container.removeFirst():container.removeLast();
}
公共无效推送(E元素){
container.addLast(元素);
}
公共无效pushAll(E…元素){
for(E:元素)
容器。addLast(e);
}
公共布尔值isQueue(){
返回isQueue;
}
公共void setQueue(布尔值isQueue){
this.isQueue=isQueue;
}
公共布尔切换队列(){
返回isQueue=!isQueue;
}
@凌驾
公共迭代器迭代器(){
返回container.iterator();
}
}
以下是测试:
QueueOrStack<String> strings = new QueueOrStack<>(true);
strings.pushAll("hello", ", " , "world\n");
for(String s : strings)
System.out.print(s); //"hello, world"
System.out.println(strings.pop()); //"hello"
strings.toggleQueue();
System.out.println(strings.pop()); //"world"
QueueOrStack字符串=新的QueueOrStack(true);
pushAll(“hello”、“,”和“world\n”);
用于(字符串s:字符串)
系统输出打印//“你好,世界”
System.out.println(strings.pop())//“你好”
strings.toggleQueue();
System.out.println(strings.pop())//“世界”
为什么不java.util.Queue
和java.util.Stack
为您工作?它必须是一个可以存储它们的单一变量为什么不java.util.Queue
和java.util.Stack
为您工作?它必须是一个可以存储它们的单一变量我想要类似的东西我可以调用steps.pop()和step.push()而不必考虑它是队列还是堆栈。LinkedList似乎要求您进行choice@TimothyElbert无论哪种方式,您都可以编写帮助器方法或单独的类(您在问题中提到过)。我将编辑我的答案。@Timothylbert Edited。我想要一些类似steps的东西,可以调用steps.pop()和step.push()不必考虑它是队列还是堆栈。LinkedList似乎要求您进行choice@TimothyElbert不管是哪种方式,您都可以编写助手方法或单独的类(您在问题中提到过)。我将编辑我的答案。@Timothylbert编辑。