Maxxx
Maxxx

Reputation: 3768

printing stack in a new line within a class

I have a linked stack class and I'm having the problem of printing the elements in the stack, with each element in a new line. The str function in the linked stack class is printing every element in a new line which is what i wanted but it even prints an extra new line at the end.

class Node:
    def __init__(self,item,the_next = None):
        self.item = item
        self.next = the_next

    def __str__(self):
        return str(self.item)

class LinkedStack:
    def __init__(self):
        self.top = None
        self.count = 0

    def __len__(self):
        return self.count

    def is_empty(self):
        return self.count == 0

    def isFull(self):
        return False

    def reset(self):
        self.top = None
        self.count = 0

    def __str__(self):      #im having the issue here whereby it prints a newline even after printing the last element
        current = self.top
        ans = ""
        while not (current is None):
            ans += str(current)
            ans += '\n'
            current = current.next
        return ans

if __name__ == "__main__":
    L = LinkedStack()
    L.push(1)
    L.push(2)
    L.push(3)
    print(L)

The output i get is:

3
2
1
#an extra newline printed here which is not wanted

I'm looking for a way to improvise the str function in the Linked Stack class in order to get rid of the redundant new line at the end. Any help is much appreciated.

Upvotes: 0

Views: 546

Answers (2)

Daniel Roseman
Daniel Roseman

Reputation: 599856

You could move the addition of the newline until after you get the next item, and check it is not None before you then append it.

A further optimisation then is to move the break condition to that point:

while True:
    ans += str(current)
    current = current.next
    if current is None:
        break
    ans += '\n'

Upvotes: 2

TDk
TDk

Reputation: 1059

Why not simply trim the return value of __str__ like so return ans[:-1] ? Since you always append a new line after adding an element to the string.

On a side note, it could be nicer to write your function like so:

def __str__(self):
    strs = []
    cur = self.top
    while cur is not None:
        strs = [str(cur)] + strs
        cur = cur.next
    return '\n'.join(strs)

Upvotes: 2

Related Questions