使用列表、erlang处理堆栈

使用列表、erlang处理堆栈,erlang,Erlang,我有一个堆栈,我想把一个列表推到堆栈中。例如 comp:stack({push,[{{plus,{num,2},{num,2}}]},[]) 然后它应该存储在堆栈中,类似这样 {{num,2},{num,2},plus}-例如,push plus将位于底部,然后num2将位于顶部,另一个num2将位于上一个num2的顶部 现在我想打开整个列表,得到这样的东西 {{num,2},{num,2},plus} 这是我到目前为止的代码,它所做的只是一次推一个和弹出一个 stack([],StackLis

我有一个堆栈,我想把一个列表推到堆栈中。例如

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

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

{{num,2},{num,2},plus}-例如,push plus将位于底部,然后num2将位于顶部,另一个num2将位于上一个num2的顶部

现在我想打开整个列表,得到这样的东西

{{num,2},{num,2},plus}

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

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

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

我想这应该适合你:

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).
...

在从空堆栈弹出时,如何处理错误取决于您。

erlang中的用法是创建一个专用于数据结构管理的模块,并提供一些接口来操作它。您可以在stdlib库中找到这样的示例:dict、list、gb_树

您将使用的方法是:
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...

谢谢,我会试试答案。@Nothiness没问题,但是听帕斯卡的建议,他有道理。你能解释一下我如何使用这个界面或显示我听说的东西吗。每个人都说,这使他们在erlang中使用这些模块编程更容易。@Nothiness Stack是一种简单的数据结构,如果您了解如何干扰其他数据结构模块,如或您将看到常见的模式。它们没有行为(接口),但它从
NewData=data\u type:new()
开始,然后应用特定于它们的操作。数据容器通常是最后一个参数。在您的例子中,在
堆栈
模块中实现,
Stack0=new()
{Head,Stack1}=pop(Stack0)
Stack1=push(Elements,Stack0)
Boolean=is_empty(stack)
。这只是一个很好的练习,对初学者很有用。谢谢