def rev_word(string): from Stack import ArrayStack # STACK IMPORTED FROM MY OWN COLLECTION stack = ArrayStack() # ASSIGNING NEW STACK reversedWords = "" # ASSIGNING NEW STRING, WILL BE ADDED REVERSED WORDS IN HERE LATER ON word = "" #ASSIGNING NEW STRING, SO IT CAN ADD EACH WORD #I AM ADDING A WHITE SPACE AT THE END OF THE STRING #SO THE LOOP CAN UNDERSTAND THE END OF THE STRING #IF I DONT ADD THIS, THE PROGRAM WILL NOT PUT THE LAST WORD IN THE STACK ! string = string + " " for i in range(len(string)): #FOR EACH ELEMENT IN THE STRING if string[i] != " ": #IF CHAR NOT A WHITE SPACE ADD CHARS TO THE WORD word += string[i] else: if len(word) > 0: #IF THE LENGTH OF THE WORD MORE THAN ZERO stack.push(word) #ADD WORD TO THE STACK word = "" #CLEAR WORD VARIABLE, FOR THE NEXT ONE for i in range(len(stack)): reversedWords += stack.pop() + " " #ADDING EACH ELEMENT TO THE reversedWords STRING WITH SPACE BETWEEN WORDS reversedWords = reversedWords[:-1] #REMOVING THE LAST ELEMENT OF THE STRING, BECAUSE IT IS A WHITE SPACE. ADDED FROM THE PREVIOUS LINE return reversedWords
def postfixEval(tokenList): valStack = Stack() for token in tokenList: if type(token) is int: valStack.push(token) elif token == '*': v1 = valStack.pop() v2 = valStack.pop() result = v2 * v1 valStack.push(result) elif token == '/': v1 = valStack.pop() v2 = valStack.pop() result = v2 / v1 valStack.push(result) elif token == '+': v1 = valStack.pop() v2 = valStack.pop() result = v2 + v1 valStack.push(result) elif token == '-': v1 = valStack.pop() v2 = valStack.pop() result = v2 - v1 valStack.push(result) return valStack.pop()
def is_html_matched(raw): S = ArrayStack() j = raw.find('<') root = etree.Element("root") curr = root while j != -1: k = raw.find('>', j + 1) if k == -1: return None tag = raw[j + 1:k] if tag.startswith('/'): if S.is_empty(): return False elif S.pop() != tag[1:]: return False curr = curr.getparent() else: curr = etree.SubElement(curr, tag) S.push(tag) j = raw.find('<', k + 1) print(etree.tostring(root).decode('utf8')) return S.is_empty()
def is_matched(expr): left = '{([' right = '})]' S = ArrayStack() for c in expr: if c in left: S.push(c) elif c in right: if S.is_empty(): return False elif right.index(c) != left.index(S.pop()): return False return S.is_empty()
def balanced_expression(str_input): stack = ArrayStack() for i in str_input: if i not in d: stack.push(i) else: try: output = stack.pop() except: return False if output != d[i]: return False return stack.is_empty()
def balanced_expression(str_input): d = {"}": "{", ")": "(", "]": "["} stack = ArrayStack() for i in str_input: if i in "{[(": stack.push(i) else: try: out = stack.pop() if out != d[i]: return False except: return False return stack.is_empty()
def is_matched_html(html_str): lst = [i for i in get_tokens(html_str)] stack = ArrayStack() for i in lst: if i[1] == "/": try: out = stack.pop() if out[1:-1] != i[2:-1]: return False except: return False else: stack.push(i) return stack.is_empty()
def is_mathced_html(html_str): stack = ArrayStack() for i in get_tags(html_str): if i[0] != "/": stack.push(i) else: try: val = stack.pop() except: return False if i[1:] != val: return False return stack.is_empty()
class DupStack: def __init__(self): self.stack = ArrayStack() self.size = 0 def __len__(self): return len(self.size) def is_empty(self): return len(self) == 0 def push(self,e): if self.is_empty(): self.stack.push((e,1)) else: prev,dup = self.stack.top() if prev == e: self.stack.pop() self.stack.push((prev,dup+1)) else: self.stack.push((e,1)) self.size += 1 def top(self): if self.is_empty(): raise Exception("Empty!!") return self.stack.top()[0] def top_dups_count(self): if self.is_empty(): raise Exception("Empty!!") return self.stack.top()[1] def pop(self): if self.is_empty(): raise Exception("Empty!!") value,count = self.stack.top() if count == 1: return self.stack.pop()[0] else: self.stack.pop() self.stack.push(value,count-1) self.size -= 1 def pop_dups(self): if self.is_empty(): raise Exception("Empty!!") value,count = self.stack.pop() self.size -= count return value
def convert(S): ''' materialize to ArrayStack ''' opStack = ArrayStack() answer = '' for c in S: if c not in "*/+-()": answer += c elif c == '(': opStack.push(c) elif c == ")": while opStack.peek() != "(": answer += opStack.pop() opStack.pop() elif (not opStack.isEmpty()) and prec.get(c) <= prec.get( opStack.peek()): answer += opStack.pop() opStack.push(c) else: opStack.push(c) while not opStack.isEmpty(): answer += opStack.pop() return answer
def infixToPostfix(tokenList: list) -> list: ''' Algoritms Architecture 1) 피연산자이면 그냥 출력 2) '('이면 스택에 push 3) ')' 이면 '('이 나올때 까지 스택에서 pop, 출력 4) 연산자이면 스택에서 이보다 높(거나 같)은 우선순위 것들을 pop, 출력 그리고 이 연산자는 스택에 push 5) 스택에 남아 있는 연산자는 모두 pop, 출력. ''' prec = { '*': 3, '/': 3, '+': 2, '-': 2, '(': 1, } opStack = Stack() postfixList = [] for token in tokenList: if type(token) is int: postfixList.append(token) else: if opStack.isEmpty() and token in prec.keys(): opStack.push(token) elif token == '(': opStack.push(token) elif token == ')': while opStack.peek() != '(': postfixList.append(opStack.pop()) opStack.pop() elif prec.get(opStack.peek()) < prec.get(token): opStack.push(token) else: postfixList.append(opStack.pop()) opStack.push(token) while not opStack.isEmpty(): postfixList.append(opStack.pop()) return postfixList