使用C ++中的链接列表进行堆栈

时间:2018-10-18 18:17:35

标签: c++ linked-list

任何人都可以帮助我解决这个小问题吗? 我正在尝试使用c ++中的链接列表来实现堆栈。 当我输入end时,程序应该显示堆栈中的元素,但是程序只是输出我输入的最后一个元素,每当我输入pop时,程序都会忽略我的第一个压入元素。 程序应通过来自绞合输入的命令进行推送和弹出,例如(推送2,推送1,弹出,窥视或结束) 任何帮助将不胜感激。

#include <iostream>
#include <string>
#include <limits>
using namespace std;

class Stack
{
private:
    struct node
    {
        int data;
        node* next;
    };

public:
    node* top;
    Stack()
    {
        top = NULL;
    }

    void push(int n)
    {
        node* temp = new node;
        temp->data = n;
        temp->next = NULL;
        top = temp;
    }

    int pop()
    {
        node* temp = top;
        top = top->next;
        return temp->data;
    }

    int peek()
    {
         return top-> data;
    }

    bool isEmpty()
    {
        return top == NULL;
    }
};

int main()
{
    Stack stack;

    std::string command;

    while (true)
    {
        std::cout << "stack>";
        std::cin >> command;
        try
        {
            if (command == "pop")
            {
                if (stack.isEmpty())
                {
                    throw std::runtime_error("error: stack is empty");
                }
                std::cout << stack.pop() << std::endl;
            }

            else if (command == "push")
            {
                int n;
                if (!(std::cin >> n))
                {
                    throw std::runtime_error("error: not a number");
                }
                stack.push(n);
            }

            else if (command == "peek")
            {
                if (stack.isEmpty())
                {
                    throw std::runtime_error("error: stack is empty");
                }
                std::cout << stack.peek() << std::endl;
            }

            else if (command == "end")
            {
                while (!(stack.isEmpty()))
                {
                    std::cout << stack.pop() << std::endl;
                }
                return 0;
            }
            else
            {
                throw std::runtime_error("error: invalid command");
            }
         }
         catch (std::runtime_error& e)
         {
            std::cin.clear();
            std::cin.ignore(numeric_limits<streamsize>::max(), '\n');
            std::cerr << std::endl << e.what() << std::endl;
        }
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

您的问题出在fetch(connectHelper,{ method: 'POST', body: authCode, }).then(res => { console.log(res.json()) })

push

应该是:

    void push(int n)
    {
        node* temp = new node;
        temp->data = n;
        temp->next = NULL;
        top = temp;  // At this point, you have forgotten about the old value of top
    }

void push(int n) { node* temp = new node; temp->data = n; temp->next = top; // Link rest of stack in top = temp; } 中也有内存泄漏,并且在pop中需要一个析构函数,一个拷贝构造函数和一个拷贝赋值运算符(如果不这样做,则可以删除最后两个)想写出来。)