python如何使用堆栈解码单词?

时间:2017-05-25 16:01:31

标签: python

我有一个txt文件,其编写如下:

6
abcd<<<<<<
n<J<g<1<A<
ABCD<<<1>>>2<<3>->>>>>>

我想用python使用&#39; stack&#39;来解码这个文件。 。 在此文件中,&#39;&lt;&#39;意味着光标移动这个←方式 &#39;&gt;&#39;表示光标移动→这种方式 和&#39; - &#39;表示在光标的位置后删除左侧单词。

所以最后,我想要的是

abcd
A1gJn
A1BC32

我试图通过某种功能来解决这个问题 但我不知道我的功能有什么问题。 下面写的就是我所做的。

def decodeString_stack(string):
"""Recover a string from a keylog string
input: string(string), output:(decoded string)
deCoded[ ] : list of decoded string(cursor left)
temp[ ] : list of decoded string(cursor right)
"""
    deCoded=[]; temp=[]

  for ch in string:
     if ch=='<':
        x=deCoded.pop()
        temp.append(x)
     elif ch=='>':
        x=temp.pop()
        deCoded.append(x)
     elif ch=='-':
        del deCoded[len(deCoded)-1]
  return ''.join(deCoded)

它总是停止因为列表是空的

import time
fr=open("input.txt",'r')
fw=open("output_txt",'w')

print('start decoding')
startTime=time.time()

for aLine in fr:
   deCoded=decodeString_stack(aLine)
   print(deCoded)

exeTime=time.time()-startTime

print("decode complete(laspe time= %.2f sec)" %exeTime)
fr.close(); fw.close()

我怎么能做对吗?

1 个答案:

答案 0 :(得分:0)

请注意,您正在定义一个空列表'deCoded',然后立即尝试从其中“pop()”。要使pop工作,必须在列表中添加一些内容。我怀疑这是作业,所以我不会深入研究解决方案 - 只需注意pop是从堆栈中取出的东西,但如果不存在则你不能取消东西:)

    deCoded=[]; temp=[]

  for ch in string:
     if ch=='<':
        x=deCoded.pop()
        temp.append(x)

不要放弃太多,希望这会让你开始。此外,如果你还没有使用它,我强烈推荐Pycharm。您可以免费获得它 - 它将允许您逐步调试代码。这将是一个救生员。

def decode_line(line : str):
    temp = []
    decoded = []
    for char in line:
        if char == "<":
            if temp:
                c = temp.pop()
                decoded.append(c)
        elif char == ">":
            pass
        elif char == "-":
            pass
        else:
            temp.append(char)

    reversed = decoded[::-1]
    return reversed


with open('source.txt') as source:
    for line in source:
        out = decode_line(line)
        print(out)