我有一个任务以前缀表示法输入数学问题的字符/整数列表,并在输入错误时输出结果或错误。输入将是 main([list], X),输出应该是结果。
我的问题是尝试以我在 C 中的方式使用堆栈,以便我可以使用我知道但不知道如何实现它的前缀方法。
我目前在尝试使用 OStack([]) 时遇到错误。作为声明,想知道是否有人可以解释或显示使用全局列表/数组的基本设置,或者我是否必须使用 main 传递的列表并创建多个方法。
具体来说,我想知道我是否可以像现在这样使用 OpStack 和 OStack,以及如何做到这一点。
谢谢你。
/* Used to imitate a stack */
pop(E, [E|Es],Es).
push(E, Es, [E|Es]).
seehead([X|TAIL],X).
OpStack([]).
OStack([]).
loop(Y,[X|TAIL]) :- integer(X), !,
pop(Popped, OStack, OStack),
pop(Marker, OpStack, OpStack),
pop(Operator, OpStack, OpStack),
Z is Y + Operator + Popped,
( integer(seehead([TAIL],Z)) ->
loop(Y, [Pop2|OStack]);
push(Z, OStack, OStack), main(TAIL,X)
).
main([X |[]], X):-write(X).
main([X| TAIL],Z):- X == +, !, push(+, OpStack, OpStack), push("X", OStack, OStack), main(TAIL, Z).
main([X| TAIL],Z):- X == *, !, push(*, OpStack, OpStack), push("X", OStack, OStack), main(TAIL, Z).
main([X| TAIL],Z):- X == -, !, push(-, OpStack, OpStack), push("X", OStack, OStack), main(TAIL, Z).
main([X| TAIL],Z):- X == /, !, push(/, OpStack, OpStack), push("X", OStack, OStack), main(TAIL, Z).
main([X|TAIL], Z):- integer(X),!,
( seehead([TAIL],Z) == "X" ->
push(X, OStack, OStack), main(TAIL,X);
loop(Y,OStack)
).