Пример #1
0
class RootishArrayStack(BaseList):
    def __init__(self, iterable=[]):
        self._initialize()
        self.add_all(iterable)

    def _initialize(self):
        self.n = 0
        self.blocks = ArrayStack()

    def _i2b(self, i):
        return int(ceil((-3.0 + sqrt(9 + 8 * i)) / 2.0))

    def grow(self):
        self.blocks.append(new_array(self.blocks.size() + 1))

    def shrink(self):
        r = self.blocks.size()
        while r > 0 and (r - 2) * (r - 1) / 2 >= self.n:
            self.blocks.remove(self.blocks.size() - 1)
            r -= 1

    def get(self, i):
        if i < 0 or i > self.n - 1: raise IndexError()
        b = self._i2b(i)
        j = i - b * (b + 1) / 2
        return self.blocks.get(b)[j]

    def set(self, i, x):
        if i < 0 or i > self.n - 1: raise IndexError()
        b = self._i2b(i)
        j = i - b * (b + 1) / 2
        y = self.blocks.get(b)[j]
        self.blocks.get(b)[j] = x
        return y

    def add(self, i, x):
        if i < 0 or i > self.n: raise IndexError()
        r = self.blocks.size()
        if r * (r + 1) / 2 < self.n + 1: self.grow()
        self.n += 1
        for j in range(self.n - 1, i, -1):
            self.set(j, self.get(j - 1))
        self.set(i, x)

    def remove(self, i):
        if i < 0 or i > self.n - 1: raise IndexError()
        x = self.get(i)
        for j in range(i, self.n - 1):
            self.set(j, self.get(j + 1))
        self.n -= 1
        r = self.blocks.size()
        if (r - 2) * (r - 1) / 2 >= self.n: self.shrink()
        return x

    def clear(self):
        self.blocks.clear()
        self.n = 0
Пример #2
0
class RootishArrayStack(BaseList):
    def __init__(self, iterable=[]):
        self._initialize()
        self.add_all(iterable)
        
    def _initialize(self):
        self.n = 0
        self.blocks = ArrayStack()

    def _i2b(self, i):
        return int(ceil((-3.0 + sqrt(9 + 8*i)) / 2.0))
    
    def grow(self):
        self.blocks.append(new_array(self.blocks.size()+1))
    
    def shrink(self):
        r = self.blocks.size()
        while r > 0 and (r-2)*(r-1)/2 >= self.n:
            self.blocks.remove(self.blocks.size()-1)
            r -= 1
    
    def get(self, i):
        if i < 0 or i > self.n - 1: raise IndexError()
        b = self._i2b(i)
        j = i - b*(b+1)/2
        return self.blocks.get(b)[j]

    def set(self, i, x):
        if i < 0 or i > self.n - 1: raise IndexError()
        b = self._i2b(i)
        j = i - b*(b+1)/2
        y = self.blocks.get(b)[j]
        self.blocks.get(b)[j] = x
        return y
    
    def add(self, i, x):
        if i < 0 or i > self.n: raise IndexError()
        r = self.blocks.size()
        if r*(r+1)/2 < self.n + 1: self.grow()
        self.n += 1
        for j in range(self.n-1, i, -1):
            self.set(j, self.get(j-1))
        self.set(i, x)
    
    def remove(self, i):
        if i < 0 or i > self.n - 1: raise IndexError()
        x = self.get(i)
        for j in range(i, self.n-1):
            self.set(j, self.get(j+1))
        self.n -= 1
        r = self.blocks.size()
        if (r-2)*(r-1)/2 >= self.n: self.shrink()
        return x

    def clear(self):
        self.blocks.clear()
        n = 0
Пример #3
0
class DualArrayDeque(BaseList):
    def __init__(self, iterable=[]):
        self._initialize()
        self.add_all(iterable)

    def _initialize(self):
        self.front = ArrayStack()
        self.back = ArrayStack()

    def get(self, i):
        if i < self.front.size():
            return self.front.get(self.front.size() - i - 1)
        else:
            return self.back.get(i - self.front.size())

    def set(self, i, x):
        if i < self.front.size():
            return self.front.set(self.front.size() - i - 1, x)
        else:
            return self.back.set(i - self.front.size(), x)

    def add(self, i, x):
        if i < self.front.size():
            self.front.add(self.front.size() - i, x)
        else:
            self.back.add(i - self.front.size(), x)
        self._balance()

    def remove(self, i):
        if i < self.front.size():
            x = self.front.remove(self.front.size() - i - 1)
        else:
            x = self.back.remove(i - self.front.size())
        self._balance()
        return x

    def _balance(self):
        n = self.size()
        mid = n // 2
        if 3 * self.front.size() < self.back.size(
        ) or 3 * self.back.size() < self.front.size():
            f = ArrayStack()
            for i in range(mid):
                f.add(i, self.get(mid - i - 1))
            b = ArrayStack()
            for i in range(n - mid):
                b.add(i, self.get(mid + i))
            self.front = f
            self.back = b

    def clear(self):
        self.front.clear()
        self.back.clear()

    def size(self):
        return self.front.size() + self.back.size()
Пример #4
0
class DualArrayDeque(BaseList):
    def __init__(self, iterable=[]):
        self._initialize()
        self.add_all(iterable)

    def _initialize(self):
        self.front = ArrayStack()
        self.back = ArrayStack()

    def get(self, i):
        if i < self.front.size():
            return self.front.get(self.front.size() - i - 1)
        else:
            return self.back.get(i - self.front.size())

    def set(self, i, x):
        if i < self.front.size():
            return self.front.set(self.front.size() - i - 1, x)
        else:
            return self.back.set(i - self.front.size(), x)

    def add(self, i, x):
        if i < self.front.size():
            self.front.add(self.front.size() - i, x)
        else:
            self.back.add(i - self.front.size(), x)
        self._balance()

    def remove(self, i):
        if i < self.front.size():
            x = self.front.remove(self.front.size() - i - 1)
        else:
            x = self.back.remove(i - self.front.size())
        self._balance()
        return x

    def _balance(self):
        n = self.size()
        mid = n // 2
        if 3 * self.front.size() < self.back.size() or 3 * self.back.size() < self.front.size():
            f = ArrayStack()
            for i in range(mid):
                f.add(i, self.get(mid - i - 1))
            b = ArrayStack()
            for i in range(n - mid):
                b.add(i, self.get(mid + i))
            self.front = f
            self.back = b

    def clear(self):
        self.front.clear()
        self.back.clear()

    def size(self):
        return self.front.size() + self.back.size()
Пример #5
0
class Palindrome:
    """
    Class for finding palindromes.
    """
    def __init__(self):
        """
        Initialize with empty stack
        """

        self._stack = ArrayStack()

    def _read_ukrainian(self, filename: str) -> list:
        """
        Return list of ukrainian words in the same order as in the filename.
        """

        # words_list = []
        with open(filename, mode='r', encoding="UTF-8") as words_file:
            for line in words_file:
                if line[0] != ' ':
                    ind = line.find(' ')
                    word = line[:ind]
                    # words_list.append(word)
                    self._stack.push(word)

        return list(self._stack)

    def _read_english(self, filename: str) -> list:
        """
        Return list of english words in the same order as in the filename.
        """

        # words_list = []
        with open(filename, mode='r', encoding="UTF-8") as words_file:
            for line in words_file:
                word = line.strip()
                # words_list.append(word)
                self._stack.push(word)

        return list(self._stack)

    def read_file(self, filename: str) -> list:
        """
        Return list of words in the same order as in the filename.
        """

        self._stack.clear()

        with open(filename, mode='r', encoding="UTF-8") as words_file:
            char = words_file.readline()[0]
            if ord(char.lower()) == 1072:
                return self._read_ukrainian(filename)
            if ord(char.lower()) == 97:
                return self._read_english(filename)

        return None

    def find_palindromes(self, read_filename: str,
                         write_filename: str) -> list:
        """
        Return list of polindromes.
        """

        self.read_file(read_filename)
        words = self._stack
        polindromes = ArrayStack()
        for word in words:
            if word == word[-1::-1]:
                polindromes.push(word)

        self.write_to_file(write_filename, polindromes)
        return list(polindromes)

    @staticmethod
    def write_to_file(filename: str, polindromes: ArrayStack):
        """
        Writes polindromes to file.
        """

        text = ""

        for polindrome in polindromes:
            text += f'{polindrome}\n'

        with open(filename, mode='w', encoding="UTF-8") as write_file:
            write_file.write(text)
Пример #6
0
 def arclear_unit_test(self):
     temp = ArrayStack()
     for count in range(4):
           temp.push(count+1)
     temp.clear()
     self.assertEqual(temp.isEmpty(), True)
Пример #7
0
# Remove all the items from stack1 until there is only 3 items left in it:
# <your code>

n = 10
while n > 4:
    stack1.pop()
    n -= 1

print("After removing all but 3 items from stack1:")
printStack1()

# Part 5:
# Use a single method to empty stack1:
# <your code>

stack1.clear()

print("After emptying stack1:")
printStack1()

# Part 6:
# Use pop() and push() to move all even valued items from stack2 to stack1.
# This will leave stack2 empty.
# This will leave stack1 with only even valued items.
# stack1 will be in the reverse order from the original stack2 order.
# When popping, use a try/except block to catch and ignore the KeyError exception.
# <your code>

for i in range(0, len(stack2)):
    try:
        x = stack2.pop()