2017-05-25 38 views
0

我有是這樣寫的txt文件:python如何解碼使用堆棧的單詞?

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

,我想用「疊加」蟒蛇這個文件進行解碼。 在這個文件中,'<'表示光標移動此←方式 '>'表示光標移動→這種方式 和' - '表示在光標位置後右刪除左邊的單詞。

所以最後,我應該想的是

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

我怎樣才能作出正確的?

+0

如果您的問題已被解答,請將其標記爲此。 – SteveJ

回答

0

請注意,您正在定義一個空列表'deCoded',然後立即嘗試'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) 
+0

你能給我一個關於使'解碼'爲非空狀態的提示嗎?我不知道如何確定解碼和臨時 – user50127

+0

@ user50127;給我一下,我會鞭打一些東西。 – SteveJ