仅使用单个堆栈的A B C D的可能输出顺序?

如何解决仅使用单个堆栈的A B C D的可能输出顺序?

我想仅使用一个堆栈来确定序列A B C D的可能输出。

我正在尝试生成输出A D B C,但是没有成功。

可能的输出顺序是什么?

解决方法

给出一个输入序列A B C D和一个空堆栈,您可以执行以下操作:

  1. 从输入序列中获取下一个值并将其压入堆栈
  2. 从堆栈中弹出一个值并将其输出
  3. 从输入序列中获取下一个值并将其输出

动作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):

    1. 转到字符串的中间==> A B | C D
    1. 从中间到左使用索引id_to_left,从中间到右使用id_to_right
    1. 使用id_to_right将一个元素插入堆栈,然后使用id_to_left插入一个元素
    1. 重复动作3直到结束。
    1. 从堆栈中输出元素。

演示:

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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-