создание стека в java

#java #vector #stack

#java #вектор #стек

Вопрос:

Мне нужно использовать stack для создания списка, хранящего объекты, и я пытаюсь найти в API, однако я понятия не имею, на какой синтаксис я должен ссылаться.

Вот мой код:

 public class Rock {
public String name;

public Rock(String name){
    this.name=name;
}
}



public class RockTest{
    public static void main(String[] args){
    Rock r1 = new Rock("eluanshi");
    Rock r2 = new Rock("jingangshi");
    Rock r3 = new Rock("dalishi");
    Stack(r1,r2,r3); // this is obviously wrong but how can i deal with it
}



 }
  

Комментарии:

1. «Мне нужно использовать stack для создания списка, хранящего объекты» Ну, тебе нужен a Stack , или a List ?. Выберите один.

2. Не переходите на язык, делая случайные вещи. Следуйте инструкциям и поймите, что вы делаете.

3. Это Java, а не C . Пожалуйста, следуйте инструкциям. Вы можете начать с официальных руководств по Java .

4. если вы используете stack, создайте экземпляр нового стека и используйте метод stack.push(Object) , если используете List, создайте экземпляр ArrayList и используйте list.add(Object)

5. @CommuSoft конечно, но это Java, а не другой язык программирования :).

Ответ №1:

Stack — это универсальный тип, и у него есть только конструктор без аргументов. Вам нужно, чтобы push ваши данные в стеке:

 Stack<Rock> stack = new Stack<Rock>();//use new Stack<>() in Java 7 (diamond inference)
stack.push(r1);
stack.push(r2);
stack.push(r3);
  

Это приведет к стеку с r3 on top. Вы можете отменить push инструкции, если хотите r1 сверху.


Generics ( <> часть) определяет тип элементов, которые будет содержать ваш стек. Если вы используете Rock (как в приведенном выше примере), вы можете только помещать камни в стек. Однако преимущество заключается в том, что вы уверены, что когда вы pop используете элемент, это камень. Если вы, например, хотите создать стек с несколькими элементами ( String , …), вы можете использовать object:

 Stack<Object> stack = new Stack<>();
stack.push(r1);//rock at the bottom
stack.push("Second item");
stack.push(r2);
stack.push((Integer) 2);
stack.push("Four elements already");
stack.push(r3);
  

Недостатком этого, конечно, является то, что вы не можете определить во время компиляции тип элемента, который вы будете извлекать из стека.


Вы можете выполнить итерацию с Stack помощью Stack<T>.iterator метода:

 Stack<Rock> stack = new Stack<Rock>();
stack.push(r1);
stack.push(r2);
stack.push(r3);
Iterator<Rock> iter = stack.iterator();
while(iter.hasNext()) {
    Rock r = iter.next();
    //do something with the current rock
}
  

В современных версиях Java (вероятно, начиная с Java 7) вы можете использовать foreach-construct:

 Stack<Rock> stack = new Stack<Rock>();
stack.push(r1);
stack.push(r2);
stack.push(r3);
for(Rock r : stack) {
    //do something with the current rock
}
  

Обратите внимание, что итератор для стека работает сверху вниз. r3 Сначала будет повторяться So.

Комментарии:

1. Оператор diamond <> был введен в Java 7, а не в Java 5. Но в остальном хороший ответ!

2. Действительно, извините, иногда я путаю версии языков программирования. Исправит это. Спасибо.

3. @CommuSoft содержимое под horizon очень полезно, кстати, как мне выполнить итерацию по стеку? также используя метод итератора? Но, похоже, я получаю только имя класса пакета @ hashcode