C数据结构理论和技术 - 同一堆栈中的ints和chars

时间:2014-07-08 18:54:37

标签: c data-structures

我正在努力将中缀表达式转换为前缀表达式,并决定使用堆栈来保存我的表达式。我正在使用链表方法来实现堆栈,并使用以下数据结构:

struct stacknode {
    char char_val;
    int int_val;
    struct stacknode *nextptr;
    struct stacknode *prevptr;
};

然后我为push()push_int()编写了两个不同的push_char()函数。

push_int()'\0'的值分配给char_val,然后将值推送到int_val

push_char()将值-1分配给int_val,然后将值推送到char_val

请注意,正在使用的所有整数值都是> 0

然后我编写了其余的函数来处理这样一个事实:每个节点中的重要值可能是int或char,使用'\ 0'和-1的“否定”值来识别节点是否是“int”节点或“char”节点。

基本上,我想知道我是否认为数据结构都是错误的。有更好的方法吗?

2 个答案:

答案 0 :(得分:6)

虽然您的实施没有错误,但我认为使用tagged union可能更为惯用/显而易见。

然后你可以这样做:

struct StackValue
{
    _Bool is_int;
    union
    {
        char c;
        int i;
    } data;
};

struct StackNode
{
    struct StackValue data;
    struct StackNode *nextptr, *prevptr;
};

答案 1 :(得分:2)

为什么不有两个堆栈 - 一个用于数字,另一个用于运营商。

然后,您可以应用分流算法 - http://en.wikipedia.org/wiki/Shunting-yard_algorithm

修改

你也可以避免使用指针 - 只需在两个堆栈上加上一个上限并将索引存储到顶部元素