2017-09-21 6 views
1

그래서 이중 연결 목록을 만들고 linkedlist 클래스에서 스택 및 대기열 클래스를 만들고 RPN calculator을 생성해야하는 과제가 있습니다. 지금까지 나는 이중 링크드 클래스와 다른 클래스를 만들었습니다. 그러나 스택 및 큐에 연결된 목록 클래스를 상속하고 사용하는 방법을 이해하는 데 문제가 있습니다. 나는 내가 지금까지 가지고있는 것을 제공 할 것이다.이중 링크 목록을 C++의 스택 및 대기열 클래스로 연결

저는 개인 교습에 들어갔고 많은 도움을받지 못 했으므로 도움이 필요하다고 생각했기 때문에 숙제를 끝내지 말고 올바른 방향으로 지적해야합니다.

Stack.h

using std::iterator; 
using std::vector; 
using std::string; 

template<class T> 
class Stack : public vector<T> 
{ 
private: 
    T getElement(bool erase); 
    typename std::vector<T> ::iterator pEnd; 
    T top; 

public: 
    Stack(); 
    T pop(); 
    T peek(); 
    void push(T elem); 
}; 



template<class T> 
Stack<T>::Stack() 
{ 

} 

template<class T> 
void Stack<T>::push(T elem) 
{ 
    this->push_back(elem); 

} 

template<class T> 
T Stack<T>::peek() 
{ 
    return this->getElement(false); 
} 

template<class T> 
T Stack<T>::pop() 
{ 
    return this->getElement(true); 
} 

template<class T> 
T Stack<T>::getElement(bool erase) 
{ 
    this->pEnd = this->end() - 1; 
    T tmp; 
    if (this->size() > 0) 
    { 
     tmp = *this->pEnd; 
     if (erase) { 
      this->erase(pEnd); 
     } 
    } 

    return tmp; 

} 

Queue.h이

using namespace std; 

class Queue 
{ 

private: 
    int items[MAXQUEUE]; 
    int head; 
    int tail; 

public: 
    Queue(); 
    bool isEmpty(); 
    bool isFull(); 
    bool enqueue(int item); 
    int dequeue(); 
    int peek(); 
}; 



Queue::Queue() 
    :head(QEMPTY), tail(QEMPTY) 
{ 

} 

bool Queue::isEmpty() 
{ 
    return this->head == this->tail; 

} 

bool Queue::isFull() 
{ 

    return this->tail == MAXQUEUE; 
} 

bool Queue::enqueue(int item) 
{ 
    if (this->isFull()) 
     return false; 

    this->items[this->tail] = item; 
    tail = (tail + 1) % MAXQUEUE; 
    return true; 

} 

int Queue::dequeue() 
{ 
    if (this->isEmpty()) 
     return EMPTY; 

    int item = this->items[head]; 
    this->head = (this->head + 1) % MAXQUEUE; 
    return item; 
} 

int Queue::peek() { 

    return this->tail; 
} 

doublylinkedlist.h이

using std::iterator; 
using std::vector; 
using std::string; 



/*START OF NODE CLASS*/ 
/*---------------------------------------------*/ 
template<class T> 
struct Node 
{ 

    T Data; 
    T Search; 
    T value; 
    Node<T>*Next; 
    Node<T>*Prev; 
}; 


template<class T> 
class LinkedList 
{ 
private: 
    Node<T> *Head; 
public: 
    LinkedList(); 
    void addNode(T Data); 
    void deleteNode(T Search); 
    void insert(T Search, T value); 
    void printListBackwards(); 
    void printListForwards(); 
}; 
template<class T> 
LinkedList<T>::LinkedList() 
{ 
    this->Head = NULL; 

} 

template<class T> 
void LinkedList<T>::addNode(T data) 
{ 

    if (Head == NULL) 
    { 
     Head = new Node<T>; 
     Head->Data = data; 
     Head->Next = NULL; 
     Head->Prev = NULL; 

    } 
    else 
    { 
     Node<T>*p = this->Head; 


     while (p->Next != NULL) 

      p = p->Next; 

     Node<T>*n = new Node<T>; 
     n->Data = data; 
     n->Next = NULL; 
     p->Next = n; 
     n->Prev = p; 
    } 


} 

template<class T> 
void LinkedList<T>::insert(T Search, T value) 
{ 

    Node *p = Head; 
    while (p->Data != Search) 
    { 
     p = p->Next; 
    } 

    Node *n = new Node; 
    n->Data = value; 
    n->Next = p->Next; 
    p->Next = n; 

} 

template<class T> 
void LinkedList<T>::deleteNode(T Search) 
{ 
    Node *p = Head; 
    while (p->Next->Data != Search) 
    { 
     p = p->Next; 
    } 

    Node *delPtr = p->Next; 
    p->Next = p->Next->Next; 

    delete delPtr; 
} 

template<class T> 
void LinkedList<T>::printListBackwards() 
{ 
    Node<T> *p = Head; 

    while (p->Next != NULL) 
    { 

     p = p->Next; 
    } 
    while (p != NULL) 
    { 
     cout << p->Data<< endl; 
     p = p->Prev; 
    } 
} 

template<class T> 
void LinkedList<T>::printListForwards() 
{ 

    Node<T> *p = Head; 
    while (p != NULL) 
    { 
     cout << p->Data << endl; 
     p = p->Next; 
    } 
} 
+0

무엇이 질문입니까? 우리는 정확하게 당신이 이해하지 못하는 부분을 모른 채 대답 할 수 없다. –

+0

@PasserBy 미안하지만 스택과 대기열에 추가하기 위해 스택과 대기열 클래스의 연결된 목록에서 상속을 사용하기로되어 있지만 나는 그렇지 않다. 그것을하는 방법을 확실히. –

답변

0

이중 연결리스트는 광고 일 수있다 머리 또는 꼬리 부분에 붙이고 꼬리 부분에서 제거하십시오.

스택은 한쪽 끝 (머리?)을 밀어 내고 동일한 끝 (머리)에서 튀어 오릅니다.

대기열은 한쪽 끝 (꼬리)을 누르고 다른 쪽 (머리)을 나타냅니다.