使用基于LinkedList的堆栈反转String

时间:2017-03-03 23:12:05

标签: java string linked-list stack reverse

给我的赋值是:创建一个应用程序,通过使用基于链表的堆栈数据结构来反转列表。运行程序时,它会要求您输入输入。按Enter键时,它以相反的顺序显示输入。您这次决定输入数据类型。

我创建了我的Node类或者Link类,我的LinkedList类,LinkedListStack类,现在我被困在main方法中。我在下面发布了所有代码,希望有人帮我找到我正在制作的错误。我查看了其他帖子,但其中大多数都处理了仅仅反转链表,字符串或链表列表arraylist。

这是我不断得到的错误:

time.sleep()

链接列表类

from tkinter import *
import time
import threading
main = Tk()


def threadspawner():
    global var1
    global var2
    print(var1.get(),var2.get())
    if var1.get() != 0:
        lbl1.start() #<-- starts the spinning wheel to show that something is happening
        time.sleep(1)  #start doing stuff here
        lbl1.stop() #<-- Turns off the spinning wheel
    if var2.get() != 0:
        lbl2.start() #<-- starts the spinning wheel to show that something is happening
        time.sleep(2)
        lbl2.stop() #<-- Turns off the spinning wheel

class Loader(Label):
    positions_text = '/-\\'
    #positions_imgs = [PhotoImage(file='icons\\wheel.gif', format="gif -index "+str(i)) for i in range(3)]
    def __init__(self, parent, *args, **kwargs):
        kwargs['text']=''
        Label.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        self.runnng = False
        self.pos = 0
    def start(self):
        self.running = True
        self.parent.after(0,self.update)

    def update(self):
        self.config(text = self.positions_text[self.pos])
        #self.config(image = self.positions_imgs[self.pos])
        self.pos = (self.pos+1)%len(self.positions_text)
        #self.pos = (self.pos+1)%len(self.positions_imgs)
        if self.running:
            self.parent.after(100,self.update)
        else:
            self.config(text = '✓')
    def stop(self):
        self.running = False



var1 = IntVar()
chk1 = Checkbutton(main, text='process1', onvalue=2, offvalue=0, variable=var1)
chk1.grid(row=1)
lbl1 = Loader(main) # create an instance of the Loader class
lbl1.grid(row=1, column=1)

var2 = IntVar()
chk2 = Checkbutton(main, text='process2', variable=var2)
chk2.grid(row=2)
lbl2 = Loader(main) # create an instance of the Loader class
lbl2.grid(row=2, column=1)

strt = Button(main, text='Start', command=lambda: threading.Thread(target=threadspawner).start())
strt.grid(columnspan=2)

main.mainloop()

链接堆栈类

Please enter a word: Hello
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(String.java:1967)
    at LinkedStackDemo.main(LinkedStackDemo.java:32)


public class Node 
{
  public String data;
  public Node next;

 public Node(String d)
 {
  data = d;
 }
 public void displayNode()
 {
  System.out.println(data + " ");
}
}

我的主要方法(这是我陷入困境的地方)

public class LinkedList
{
   public Node first;

   public LinkedList()
   {
      first = null;
   }
   public boolean isEmpty()
   {
      return (first == null);
   }
   public void insertFirst(String d)
   {
      Node n = new Node(d);
      n.next = first;
      first = n;
   }
   public String deleteFirst() 
   {
      //if(first == null)
       //{return first;}

      Node temp = first;
      first  = first.next;
      //temp.next = null;
      //return temp;
      return temp.data;
   }
   public void displayNode()
   {
      Node current = first;
      while(current != null)
      {
         current.displayNode();
         current = current.next;
      }
      System.out.println(" ");
   }
}

我修复了最近的问题,但现在它垂直打印代码而不是水平打印,这是我最近的问题。

这是如何打印出来的,所需的输出就是打印反向像这样,“olleH”请输入一个单词:Hello逆转顺序:H Hello逆转顺序:e H Hello逆转顺序:le H Hello逆转顺序:lle H Hello逆转顺序:olle H你好

取出System.out.println(“”);来自displayNode;没有解决垂直打印的问题。

1 个答案:

答案 0 :(得分:1)

这里绝大多数代码与您描述的问题完全无关。唯一相关的是这个:

for (int i = 1; i <= input.length(); i++)
{
  while(i<=input.length())
  {
    String c = input.substring(i,i-1);
    s.push(c);
  }
  //System.out.println("The stack is:\n"+ s);
  s.displayStack();
}

您看到的实际问题是将ii-1传递给String.substring导致的例外情况。正如它在Javadoc中所说的那样(强调我的):

  

[引发] IndexOutOfBoundsException - 如果beginIndex为负数,或者endIndex大于此String对象的长度,或 beginIndex大于endIndex

因此,您需要调用其他内容,例如input.substring(i-1, i)

但是这里还有另一个问题:您的while循环永远不会终止,因为iinput永远不会改变,因此i<=input.length()永远不会改变。因此,您只需继续将c推入堆栈,直到内存不足为止。

这个while循环根本不需要;删除它。