如何解决仅使用单个堆栈的A B C D的可能输出顺序?
我想仅使用一个堆栈来确定序列A B C D的可能输出。
我正在尝试生成输出A D B C,但是没有成功。
可能的输出顺序是什么?
解决方法
给出一个输入序列A B C D和一个空堆栈,您可以执行以下操作:
- 从输入序列中获取下一个值并将其压入堆栈
- 从堆栈中弹出一个值并将其输出
- 从输入序列中获取下一个值并将其输出
动作3与执行动作1和执行动作2的操作实际上是相同的,因此我们可以忽略动作3作为可能的动作。
为了输出所有输入值,因此我们需要执行四次动作1和四次动作2。考虑到动作2仅在仍有值的情况下才能执行,因此我们可以按顺序进行操作在堆栈上。
以下是您可以执行的一系列操作:
series of actions | output
------------------+-------------
12121212 | ABCD
12121122 | ABDC
12112212 | ACBD
12112122 | ACDB
12111222 | ADCB
11221212 | BACD
11221122 | BADC
11212212 | BCAD
11212122 | BCDA
11211222 | BDCA
11122212 | CBAD
11122122 | CBDA
11121222 | CDBA
11112222 | DCBA
可以使用一些递归函数来生成此列表。例如,通过以下JavaScript实现:
function recur(input,stack,output,actions) {
if (output.length === 4) {
console.log(actions,output);
return;
}
if (stack.length > 0) {
recur(input,stack.slice(0,stack.length - 1),output + stack[stack.length - 1],actions + "2");
}
if (input.length > 0) {
recur(input.slice(1),stack + input[0],actions + "1");
}
}
recur("ABCD","","");
如您所见,不可能产生输出ADBC。
我们可以尝试以下操作:
- 将A放入堆栈
- 从堆栈中拉出A并输出。输出为A
- 将B放入堆栈
- 将C放在堆栈上
- 将D放入堆栈
- 从堆栈中拉出D并输出。现在输出为AD
现在我们被困住了。堆栈的底部为B,顶部为C。我们现在只能输出C ...
,A B C D-> A D B C可以使用堆栈(后进先出)(情况1和2),不可能使用情况3(简而言之,@ trincot答案是情况3的完美选择)。
案例1: 我们假定对序列的元素具有 random access (基于对(@trincot):
-
- 转到字符串的中间==> A B | C D
-
- 从中间到左使用索引id_to_left,从中间到右使用id_to_right
-
- 使用id_to_right将一个元素插入堆栈,然后使用id_to_left插入一个元素
-
- 重复动作3直到结束。
-
- 从堆栈中输出元素。
演示:
it 1:加(C),加(B)==> C,B
2:加(D),加(A)==> C,B,D,A
输出:A,D,B,C
使用python的源代码:
my_list = ['A','B','C','D']
id_to_left = int(len(my_list)/2-1)
id_to_right = int(len(my_list)/2)
stack = []
# When number of elements is odd
if len(my_list) % 2 != 0:
stack.append(my_list[id_to_right])
id_to_right = id_to_right +1
while (id_to_left>=0):
stack.append(my_list[id_to_right])
stack.append(my_list[id_to_left])
id_to_left = id_to_left-1
id_to_right = id_to_right +1
for _ in range(len(stack)):
print(stack.pop(),end=" ")
结果将是:
A D B C
情况2: 仅允许顺序访问(不允许随机访问):
input : | | | | | | | | +--+ A B C D step 1) it1: > in all > out top 3 |D | | | |C | | | |B | | | |A | |A | +--+ +--+ D C B it2: > in all > out top 2 |B | | | |C | | | |D | |D | |A | |A | +--+ +--+ B C it3: > in all > stop |C | |B | |D | |A | +--+ step 2) > out all > in all > out all | | |A | | | | | |D | | | | | |B | | | | | |C | | | +--+ C B D A +--+ +--+ A D B C End. Result = A D B C
伪代码:
input : set of "n" elements
step 1:
while True :
> in all elements from the set to stack (pop elements from the list)
> n = n-1
> if n < 2 stop the loop,(break)
> out n from the stack
step 2:
> out all from the stack
> in all to stack
> out all from stack
> print result
> end.
使用python的源代码:
my_list = ['A','D']
n = len(my_list)
stack = []
# step 1
while (True):
for _ in range(len(my_list)): # in all to stack
stack.append(my_list.pop(0))
n = n - 1
if n < 2:
break
for _ in range(n): # out n from the stack
my_list.append(stack.pop())
# step 2:
for _ in range(len(stack)): # > out all from the stack
my_list.append(stack.pop())
for _ in range(len(my_list)): # > in all to stack
stack.append(my_list.pop(0))
# > out all from stack ==> print result
print("\n The result is : ",end=" ")
for _ in range(len(stack)):
print(stack.pop(),end=" ")
注意:这两种情况下,对于偶数或奇数元素的数量,您可以尝试
- A B C D-> A D B C
- A B x C D-> A D B C x
- X A B C D Y-> X Y A D B C
情况3: A)元素类似于流式传输(仅允许顺序访问),并且B)没有可用的空间内存,只有堆栈。如果您从堆栈中弹出一个元素,则无法将其推回,因为您没有放置它的位置,如果您弹出一个元素,这意味着该元素直接进入输出。 对于这种情况3,请参阅@trincot非常好的答案。
编辑信息:我添加了情况2 ,并处理了元素数量为奇数的情况。在没有解决方案的情况下,添加情况3。
,从itertools导入排列
seq =排列(['a','b','c','d'])
对于列表(seq)中的p: 打印(p)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。