数据结构和算法-栈
棧可以分為
- 順序棧: 數組實現
- 鏈式棧: 鏈表實現
空間復雜度
棧的空間復雜度:
有一個n個元素的棧, 在入棧和出棧過程中, 只需要存儲一個臨時變量存儲空間, 所以空間復雜度是O(1)
并不是說棧有n個元素, 空間復雜度就是O(n), 而是指除了原本的空間外, 算法需要的額外空間
棧要滿足后進先出(LIFO)的特性, 棧有以下幾種方法
- 判斷為空
isEmpty - 入棧
push - 出棧
pop - 返回棧頂元素
peek - 返回棧大小
size - 是否是空
isEmpty
以下是使用列表來模擬棧的操作
# coding:utf-8class Stack(object):"""模擬棧"""def __init__(self):self.items = []def isEmpty(self):return self.items == []def push(self, item):self.items.append(item)def pop(self):if self.isEmpty():raise Exception('the stack is empty')return self.items.pop()def peek(self):if self.isEmpty():raise Exception('the stack is empty')return self.items[-1]def size(self):return len(self.items)if __name__ == '__main__':s = Stack()s.push('t')s.push('e')s.push('s')assert s.pop() == 's'assert s.peek() == 'e'assert s.pop() == 'e'assert s.pop() == 't' 應用
1. 符號匹配
實現括號匹配來區分符號是否平衡. 如果是開始符號如(, {, [那么就壓入棧, 如果碰到結束符號, 則從棧頂彈出元素
class Stack(object):def __init__(self):self.stack = []def push(self, item):self.stack.append(item)def pop(self):return self.stack.pop()def isEmpty(self):return self.stack == []basic = {')': '(',']': '[','}': '{',
}def test(string):s = Stack()first = basic.values()last = basic.keys()for i in string:if i in first:s.push(i)elif i in last:if s.pop() == basic[i]:continueelse:return Falseelse:continueif s.isEmpty():return Truereturn Falseif __name__ == '__main__':assert test('[hello ( world { === })]') == Trueassert test('kk(dsfd)ll[') == False
2. 求二進制
如數字6(110), 分別用2除6, 求余數, 最后余數反轉就是110
class Stack(object):def __init__(self):self.stack = []def push(self, item):self.stack.append(item)def pop(self):return self.stack.pop()def isEmpty(self):return self.stack == []def binary(num):s = Stack()while num > 0:n = num % 2s.push(n)num = num // 2res = ""while not s.isEmpty():res += str(s.pop())return resif __name__ == "__main__":assert binary(5) == '101'assert binary(8) == '1000'assert binary(9) == '1001'
轉載于:https://www.cnblogs.com/zlone/p/10989181.html
總結
- 上一篇: 鼋头渚赏樱专线
- 下一篇: Struts2 2.5版本新配置filt