使用list,erlang处理堆栈

时间:2015-02-19 14:18:50

标签: erlang

我有一个堆栈,我想将列表推入堆栈。例如。

  

comp:stack({push,[{{plus,{num,2},{num,2}}}]},[])。

然后它应该存储在堆栈中,类似这样

  

{{num,2},{num,2},plus} - 例如。 push plus将在底部,然后num2将返回顶部,而另一个num2将位于该prev num2的顶部。

现在我想弹出整个列表并得到类似的东西

  

{{NUM,2},{NUM,2},加上}

到目前为止,这是我的代码,它所做的只是推送一个并一次弹出一个。

stack([],StackList) -> [];
stack({push,[H|T]},StackList) -> 
{[H|T]++StackList}.
stack(pop,[StackH|StackT])-> {StackH,StackT}.

我是陌生的新手,我的解释对某些人来说可能是可怕的。请帮帮我,谢谢。

2 个答案:

答案 0 :(得分:1)

我认为这应该适合你:

stack({push, []}, StackList) -> StackList;
stack({push,[H|T]}, StackList) -> 
    stack({push, T}, [H | StackList]);
stack(pop,[StackH|StackT])-> {StackH,StackT}.
对于每个要推送的元素,递归调用

stack({push, _}, _)

使用示例:

1> S0 = comp:stack({push, [plus,{num,2},{num,2}]}, []).
[{num,2},{num,2},plus]
2> {Reg1, S1} = comp:stack(pop, S0).                           
{{num,2},[{num,2},plus]}
3> {Reg2, S2} = comp:stack(pop, S1).
{{num,2},[plus]}
4> {Op, S3} = comp:stack(pop, S2).
{plus,[]}
5> Resault = comp:operation(Op, Reg1, Reg2). %% my guess
6> S4 = comp:stack({push, [Resault]}, S3).
...

在空堆栈中弹出错误时,您需要如何处理错误。

答案 1 :(得分:1)

erlang中的用法是创建一个专用于管理数据结构的模块,并提供一些操作它的接口。您将在stdlib库中找到此示例:dict,lists,gb_trees ...

您将使用的方式是:Stack = stack:new()NewStack = stack:push(Value,Stack){Value,NewStack} = stack:pop(Stack) ...在堆栈的情况下,它很容易,因为erlang列表类型适合所有用法堆。然后,您可以编写一个模块:

-module(stack).

-export([new/0, push/2, is_empty/1]).

% add your own interfaces

new() -> [].

push(Value,Stack) when is_list(Stack) -> [Value|Stack].

is_empty([]) -> true;
is_empty(Stack) when is_list(Stack) -> false. 

% and so on...