powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Реализация дека (Double-ended-queue). Не поможите?
5 сообщений из 5, страница 1 из 1
Реализация дека (Double-ended-queue). Не поможите?
    #38599881
SRVdudko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кто реализовывал раньше такие структуры данных?? Дело все в том что нужно чтобы:
1.addFirst
2.removeFirst
3.addLast
4.removeLast
5.delete (int i) //удалить i-ый элемент

Проблема в том что нужна именно кольцевая реализация(когда голова и хвост ссылаются друг на друга)
Тут и вылезает NullPointerException - т.к. обращаюсь к нулевой ссылке

Реализация
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
package stack;
import java.util.Iterator;
public class DoubleEndedQueue<DoubleEndedQueueType> implements Iterable<DoubleEndedQueueType>{
    Node first,last;
    private int N;
    private class Node{  
    DoubleEndedQueueType val;
    Node next,prev;
     }
    
    public void addFirst(DoubleEndedQueueType ob){
        Node oldfirst=first;
        first=new Node();
        first.val=ob;
        first.next=oldfirst;
        first.prev=last;
        oldfirst.prev=first;  //NullPointerException
        N++;
    }
    
    public DoubleEndedQueueType removeFirst(){ 
        DoubleEndedQueueType ob = first.val;
        first = first.next;
        first.prev=last;
        N--;
        return ob;
    }
    
    public void addLast(DoubleEndedQueueType ob)throws NullPointerException{
        Node oldlast = last;
        last=new Node();
        last.val=ob;
        oldlast.next=last;     //NullPointerException
        last.prev=oldlast;
        last.next=first;
        N++;}
    public DoubleEndedQueueType removeLast(){
        DoubleEndedQueueType ob = last.val;
        last=last.prev;
        last.next=first;
        N--;
        return ob;}
     
    public void delete(int k){
        if(k<=N && N>0){
        int i=0;
        for(Node x=first;x!=null;x=x.next,i++){
            if(i==k){
               x.next=x.next.next;
               x.next.prev=x.prev;}
        }
      }     
    }  
    
   
    
   public static void main(String[]args) throws NullPointerException{
        DoubleEndedQueue<Character> b = new DoubleEndedQueue<>();
        b.addFirst('A');
        b.addFirst('B');
        b.addFirst('C');
        b.addLast('P');
        
        for (char ch : b) System.out.println(ch);
            
    
    }
   
   
   
   
  private class DoubleEndedQueueIterator implements Iterator<DoubleEndedQueueType> {
        private int i=N;
        private Node current=first;
        @Override
        public boolean hasNext() {return i>0;}
        @Override
        public DoubleEndedQueueType next() {
            DoubleEndedQueueType ob = current.val;
            current=current.next;
            i--;
            return ob;}
        @Override
        public void remove() {
            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }

    }
  @Override
    public Iterator<DoubleEndedQueueType> iterator() {
        return new DoubleEndedQueueIterator();
    }
}



Или может проще было бы Односвязным списком реализовать?
Вообщем как решить эту проблему.
Спасибо
...
Рейтинг: 0 / 0
Реализация дека (Double-ended-queue). Не поможите?
    #38599892
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SRVdudko ,
Вы не можете задебагать NullPointerException в своем же коде, или что? :-)
Так как про потокобезопасность вы ничего не говорили, то принципиально реализации может быть всего две: на основе массива, или на основе двусвязного списка. Учитывая, что вам нужно удаление по индексу, то я бы в первую очередь смотрел на массив.
Если самому не получается реализовать (а по хорошему, самостоятельная реализация может быть нужна только в целях самообучения, ибо все велосипеды уже давным-давно изборетены), то начинайте смотреть исходники java.util.AraryDeque - это именно то, что вам нужно.
...
Рейтинг: 0 / 0
Реализация дека (Double-ended-queue). Не поможите?
    #38600049
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SRVdudko, ты определись что тебе надо. В случае кольца фиксированного размера addFirst может и не сработать
когда кольцо переполнено и нужно выбрасывать какой-то UserDefined Exception.
...
Рейтинг: 0 / 0
Реализация дека (Double-ended-queue). Не поможите?
    #38600970
SRVdudko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо! Проблема устранена. Но появился еще один вопрос:
1.Немогу никак написать к очереди removeAfter который принимает в качестве аргумента УЗЕЛ, и удаляет след. за ним.
Не соображу как можно передать из main этот узел.
Т.е. удалить за константное время(а не пробегаться по списку).
Отметил в коде тот метод который нужно переписать

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
public class LinkedQueue<QueueType> implements Iterable<QueueType>{
    private Node first;  //первый в очереди
    private Node last;   //последний в очереди
    private int N;
    boolean isEmpty(){return N==0;}

    @Override
    public Iterator<QueueType> iterator() {
        return new ListIterator();
    }

    private class ListIterator implements Iterator<QueueType>{
 private Node current=first;

        @Override
        public boolean hasNext() {
            return current!=null;
        }
        @Override
        public QueueType next() {
            QueueType val = current.val;
            current=current.next;
            return val;
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }
        
    }
    private class Node{
        Node next;  //след узел
        QueueType val;
    }
    public  void enqueue(QueueType val){ //ложим в конец
        Node oldlast=last;
        last = new Node();
        last.val=val;
        last.next=null;
        if(isEmpty())first=last;
        else    oldlast.next=last;
        N++;
        
    }
    public QueueType dequeue(){ //удаление из начала
        QueueType val = first.val;
        first=first.next;
        N--;
        return val;
    }
    public void removeLast(){
        if(first==null)return;
         for(Node x=first;x!=null;x=x.next){
            if(x.next==last){x.next=null;last=x;}
        }
         N--;
    } 
    public void delete(int k){
    if(k<=N && k>0){
        if(k==1)dequeue();
        if(k==N)removeLast();
        else{
            int count=2;
            for(Node n=first;n!=null;n=n.next){
            if(count==k)n.next=n.next.next; 
            count++;}
            }
                    }
    }
    public boolean find(LinkedQueue q, String key){
        for(Node n=first;n!=null;n=n.next){
            if(n.val.toString().equals(key))return true;}
            return false;
    }
    public void removeAfter(int k){
        int count=1;
        for(Node n=first;n!=null;n=n.next){
            if(count==k)n.next=n.next.next;
            count++;
        }
        N--;
    }
    public void removeAfterNode(Node x){
               
        if(x.next!=null){
            x.next=x.next.next;
            N--;}
    }



Мэйн
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class ForTest {
    public static void main(String[]args){
        LinkedQueue<Character> lqueue=new LinkedQueue<>();

        
        for(int i=97;i<123;i++)lqueue.enqueue((char)i);
        lqueue.removeAfterNode('A'); [color=red]//incompatible types: char cannot be converted to LinkedQueue<Character>.Node[/color]
        
        for(char ch:lqueue)System.out.print(ch+" ");
    }
    
}
...
Рейтинг: 0 / 0
Реализация дека (Double-ended-queue). Не поможите?
    #38601129
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Реализация дека (Double-ended-queue). Не поможите?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]