gpt4 book ai didi

sml - 在 sml 中创建堆栈

转载 作者:行者123 更新时间:2023-12-02 08:22:23 24 4
gpt4 key购买 nike

我正在尝试在 sml 中创建堆栈,我尝试过使用列表;但我无法将元素添加到列表中。我正在尝试从输入文件中读取行,如果该行显示:

push 5
push 9
add
quit

然后我希望输出文件是:

14

因为 5+9 是 14。到目前为止,我已经能够创建 bool 函数来识别该行是推送的还是具有数字的。

fun is_digit (c) = #"0" <= c andalso c <= #"9";
fun is_Push (c) = String.isSubstring "push" c;

fun stack(inFile : string, outFile : string) =
let
val ins = TextIO.openIn inFile;
val outs = TextIO.openOut outFile;
val readLine = TextIO.inputLine ins;
val it = []: string list;
fun helper(readLine : string option) =
case readLine of
NONE => ( TextIO.closeIn ins; TextIO.closeOut outs)
| SOME(c) => (
if is_Push c
then
let
val number = String.sub(c,5);
val numbChar = Char.toString number;

in
val myList = nil :: numbChar;
TextIO.output(outs, Int.toString(length myList))
end

else
TextIO.output(outs, "aaa\n");
helper(TextIO.inputLine ins))

in
helper(readLine)
end

最佳答案

我建议将入栈和出栈放在列表的前面,实际入栈和出栈是通过模式匹配实现的,并将(修改后的)堆栈作为参数传递。

假设您有一个字符串列表,例如

["push 5", "push 9", "add", "quit"]

并且您想根据以下规则处理此字符串:

1) If the string is of the form "push d" (where d is a single digit) then
push the integer value of d onto the stack

2) If the string is of the form "add" then pop the first two elements off
the stack, add them, and push the sum back on

3) If the string is "quit" then return the top of the stack

在情况 3 中,您实际上返回了一个值,在其他情况下——在行列表的尾部调用处理函数并使用适当修改的堆栈。像这样的东西:

fun process ([], stack) = 0
| process ("quit"::lines, i::stack) = i
| process ("add"::lines, i::j::stack) = process(lines,(i+j)::stack)
| process (s::lines, stack) =
let
val d = String.sub(s,5)
val i = Char.ord d - Char.ord(#"0")
in
process(lines,i::stack)
end;

我加入了一个在空行列表上返回 0 的基本情况,但没有提供真正的错误检查。特别是 -- 如果在堆栈少于 2 个元素时遇到“添加”,它将因运行时错误而崩溃,而如果使用空堆栈调用“退出”将导致崩溃。

要使用它,请使用行列表和空堆栈调用它:

- process (["push 5", "push 9", "add", "quit"],[]);
val it = 14 : int

关于sml - 在 sml 中创建堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35801104/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com