簡體   English   中英

C++中不使用棧的實現<stack>

[英]Implementation of stack in C++ without using <stack>

我想做一個堆棧的實現,我在互聯網上找到了一個工作模型,不幸的是它基於我知道我想立即實現的堆棧大小的想法。 我想要做的是能夠在需要時將段添加到我的堆棧中,因為所需的插槽的最大數量可能達到 10 萬個,並且根據我的理解,使大小一成不變(當不需要所有這些時)大多數時候)是對內存的巨大浪費和程序執行速度的損失。 我也不想在我的實現中使用任何復雜的預寫函數(STL 提供的函數或不同的庫,如 vector 等),因為我想通過嘗試自己/在簡短的幫助下自己制作它們來更多地了解它們。

        struct variabl {
            char *given_name;
            double value;
        };
        variabl* variables[50000];
        int c = 0;
        int end_of_stack = 0;

        class Stack
        {
        private:
            int top, length;
            char *z;
            int index_struc = 0;


        public:
            Stack(int = 0);
            ~Stack();
            char pop();
            void push();

        };

        Stack::Stack(int size) /* 
This is where the problem begins, I want to be able to allocate the size 
      dynamically.
    */
     {
            top = -1;
            length = size;
            z = new char[length];
        }
        void Stack::push()
        {
            ++top;
            z[top] = variables[index_struc]->value;
            index_struc++;
        }
        char Stack::pop()
        {
            end_of_stack = 0;
            if (z == 0 || top == -1)
            {
                end_of_stack = 1;
                return NULL;
            }
            char top_stack = z[top];
            top--;
            length--;

            return top_stack;
        }
        Stack::~Stack()
        {
            delete[] z;
        }

我有一些想法,並嘗試做

Stack stackk
//whenever I want to put another thing into stack
stackk.push = new char;

但是后來我並沒有完全理解它如何為我的目的工作,我認為它不能通過 pop 方法等完全訪問,因為它將是一組單獨的數組/變量,對嗎? 我希望實現保持相當簡單,以便我能夠理解它。

更改push函數以獲取參數,而不是需要引用variables

要處理推送,請從數組z的初始長度開始(並將z 更改為更好的變量 name )。 當您推送新值時,請檢查新值是否意味着數組的大小太小(通過比較lengthtop )。 如果它將超過當前大小,則分配一個更大的數組並將值從z復制到新數組,釋放z ,並使 z 指向新數組。

這里有一個簡單的實現,不需要重新分配數組。 它使用輔助類 Node,它保存一個值,以及一個指向另一個 Node 的指針(設置為 NULL 以指示堆棧的結尾)。

main() 通過讀取表單的命令來測試堆棧

  • pc:將c壓入堆棧
  • g: 打印棧頂並彈出

    #include <cstdlib> #include <iostream> using namespace std; class Node { private: char c; Node *next; public: Node(char cc, Node *nnext){ c = cc; next = nnext; } char getChar(){ return c; } Node *getNext(){ return next; } ~Node(){} }; class Stack { private: Node *start; public: Stack(){ start = NULL; } void push(char c){ start = new Node(c, start); } char pop(){ if(start == NULL){ //Handle error cerr << "pop on empty stack" << endl; exit(1); } else { char r = (*start).getChar(); Node* newstart = (*start).getNext(); delete start; start = newstart; return r; } } bool empty(){ return start == NULL; } }; int main(){ char c, k; Stack st; while(cin>>c){ switch(c){ case 'p': cin >> k; st.push(k); break; case 'g': cout << st.pop()<<endl; break; } } return 0; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM