为什么当我尝试将所有字符串移入自定义的Queue模板并尝试打印时,它只打印队列中的最后一个?

时间:2018-07-19 10:48:21

标签: c++ queue

请告诉我,这是我要完成的作业。我们要做的基本事情是创建一个没有STL的堆栈和队列,然后创建带有STL的堆栈和队列。我几乎完成了创建自定义堆栈的工作,并且效果很好。但是,使用Queue时,每当我尝试将字符串移入并打印出来时,控制台只会输出最后移出的字符串。最重要的是,每当我尝试取消使用我拥有的代码输入到队列中的最后一个东西时,最终都会遇到读取访问冲突,我完全无法解决读取访问冲突。

如果您不介意的话,您可以浏览我的代码并帮助我了解造成此错误的原因是什么,并且队列中的最后一个条目是唯一打印出来的吗?提前致谢。

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

    struct Node {
        //create a node struct
        string data;
        Node *next;
    };

    class Stack {
    public:
        Stack();
        ~Stack();
        void push(string a);
        string pop();
        string toString();
        bool isEmpty();
    private:
        Node * top;
    };

    class Queue {
    public: 
        Queue();
        ~Queue();
        void shift(string a);
        string unshift();
        string toString();
        bool isEmpty();
    private:
        Node * top;
        Node * bottom;
        int count;
    };

    Stack::Stack() {
        //initializes stack to be empty
        top = NULL;
    }
    Queue::Queue() {
        //initializes stack to be empty
        top = NULL;
    }

    Stack::~Stack() {
        //deconstructor to delete all of the dynamic variable 
        if (top == NULL) {
            cout << "Nothing to clean up" << endl;
        }
        else {
            cout << "Should be deleting..." << endl;
        }
    }
    Queue::~Queue() {
        //deconstructor to delete all of the dynamic variable 
        if (bottom == NULL) {
            cout << "Nothing to clean up" << endl;
        }
        else {
            cout << "Should be deleting..." << endl;
        }
    }

    void Stack::push(string a) {
        //Need a new node to store d in
        Node *temp = new Node;
        temp->data = a;
        temp->next = top;//point the new node's next to the old top of the stack

        top = temp;//point top to the new top of the stack
    }
    void Queue::shift(string a) {
        //Need a new node to store d in
        Node *temp = new Node;
        temp->data = a;
        temp->next = NULL;//point the new node's next to the old top of the stack
        if (isEmpty()) {
            top = temp;
        }
        else {
            top->next = temp;
            count++;
        }

        top = temp;//point top to the new top of the stack
    }

    string Stack::pop() {
        if (!isEmpty()) {
            string value = top->data;
            Node *oldtop = top;
            top = oldtop->next;
            delete oldtop;
            return value;
        }
        else {
            cout << "You can't pop from an empty stack!" << endl;
            exit(1);
        }
    }
    string Queue::unshift() {
        if (isEmpty()) {
            cout << "You can't unshift an empty Queue!" << endl;
            exit(1);
        }
        else{
            Node *oldbot = top;
        if (top == bottom) {
            top = NULL;
            bottom = NULL;
        }
        else {
            string value = top->data;
        }
            delete oldbot;
            count--;
        }
    }

    string Stack::toString() {
        string result = "top ->";
        if (isEmpty()) {
            result = result + "NULL";
            return result;
        }
        else {
            Node *current = top;
            while (current != NULL) {
                result = result + current->data + "->";
                current = current->next;
            }
            result = result + "(END)";
            return result;

        }
    }
    string Queue::toString() {
        string result = "top ->";
        if (isEmpty()) {
            result = result + "NULL";
            return result;
        }
        else {
            Node *current =top;
            while (current != NULL) {
                result = result + current->data + "->";
                current = current->next;
            }
            result = result + "(END)";
            return result;

        }
    }

    bool Stack::isEmpty() {
        return(top == NULL);
    }
    bool Queue::isEmpty() {
        return(top == NULL);
    }

int main()
{
    Stack *s = new Stack();
    cout << "Output when empty: " << endl << s->toString() << endl;
    s->push("Cheeseburger");
    s->push("Pizza");
    s->push("Large coffee");
    s->pop();
    cout << "Output when not empty: " << endl << s->toString() << endl;
    delete s;

    cin.get();

    Queue *b = new Queue();
    cout << "Output when empty: " << endl << b->toString() << endl;
    b->shift("Cheeseburger");
    b->shift("Pizza");
    b->shift("Large coffee");
    cout << "Output when not empty: " << endl << b->toString() << endl;
    b->unshift();
    delete b;
    cin.get();

}

1 个答案:

答案 0 :(得分:0)

您必须在Queue :: shift方法中的以下语句中进行注释-

top = temp;