簡體   English   中英

使用堆棧實現C ++

[英]Using Stack implementation C++

我正在用C ++編寫玩具編程語言,但是遇到了問題。 我注意到在c ++中,堆棧只能存儲一種類型的數據。 我想知道是否有解決此問題的簡便方法,例如通過在堆棧中存儲每個對象的字節數組。 我想知道是否有人知道jvm如何解決這個問題。 我需要在堆棧上存儲的類型將是char,short,int,float,double,string,array和對對象的引用。 我知道jvm堆棧可能更像是一個抽象,但是如果是這樣,我仍然想知道他們是如何實現的。 如果有什么不同,我只打算針對Windows計算機。

您知道C ++支持繼承和多態嗎? 一種更簡單的方法是從一個公共基類派生所有標記,並生成一堆Base *對象,例如:

#include <iostream>
#include <string>
#include <stack>
#include <memory>

class base {
    public:
        virtual void print_token() = 0;
        virtual ~base() {}
};

class token_a : public base {
    public:
        token_a(int n) : n(n) {}
        virtual void print_token() { std::cout << n << std::endl; }

    private:
        int n;
};

class token_b : public base {
    public:
        token_b(std::string s) : s(s) {}
        virtual void print_token() { std::cout << s << std::endl; }

    private:
        std::string s;
};

int main(void) {
    std::stack<std::shared_ptr<base> > my_stack;
    my_stack.push(std::shared_ptr<base>(new token_a(5)));
    my_stack.push(std::shared_ptr<base>(new token_b("a word")));

    for ( int i = 0; i < 2; ++i ) {
        std::shared_ptr<base> pb = my_stack.top();
        pb->print_token();
        my_stack.pop();
    }

    return 0;
}

輸出:

paul@local:~/src/cpp/scratch$ ./stack
a word
5
paul@local:~/src/cpp/scratch$

我解決此問題的方式(大約25年前用C語言編寫的Lisp解釋器,但今天仍適用相同的想法)是在struct包含類型和union

struct Data   // or class
{
    enum kind { floatkind, intkind, stringkind, refkind };
    Kind kind;
    union
    {
       double f;
       int i;
       std::string s;
       Data* r;     // reference, can't use Data &r without heavy trickery. 
    } u;

    Data(double d) { kind = floatkind; u.f = d; }
    Data(int i) { kind = intkind; u.i = i; }
    ... 
}

std::stack<Data> st;

st.push(Data(42));
st.push(Data(3.14));

只是一個猜測,但是jvm可能將所有內容都視為一個對象,因此堆棧只是對象的集合。

如果創建基礎數據對象類並從中派生所有受支持的數據類型,則可以執行相同的操作。

暫無
暫無

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

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