我正在努力将中缀表达式转换为前缀表达式,并决定使用堆栈来保存我的表达式。我正在使用链表方法来实现堆栈,并使用以下数据结构:
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”节点。
基本上,我想知道我是否认为数据结构都是错误的。有更好的方法吗?
答案 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
修改的
你也可以避免使用指针 - 只需在两个堆栈上加上一个上限并将索引存储到顶部元素