>  기사  >  백엔드 개발  >  Python 데이터 구조 - 스택 및 큐 구현 (1)

Python 데이터 구조 - 스택 및 큐 구현 (1)

黄舟
黄舟원래의
2016-12-17 15:20:142596검색

1. 스택

스택은 삽입 및 삭제 작업을 한 위치로만 제한하는 테이블입니다. 이 위치는 테이블의 끝이며 스택의 상단이라고 합니다. 스택의 기본 작업은 PUSH(스택 안으로)와 POP(스택 안으로)입니다. 스택은 LIFO(후입선출) 테이블이라고도 합니다.

1.1 스택 구현

class Stack(object):
    def __init__(self):
        self.stack=[]
    def isEmpty(self):
        return self.stack==[]
    def push(self,item):
        self.stack.append(item)
    def pop(self):
        if self.isEmpty():
            raise IndexError,'pop from empty stack'
        return self.stack.pop()
    def peek(self):
        return self.stack[-1]
    def size(self):
        return len(self.stack)

1.2 스택 응용

1.2.1 프로그램에서 쌍을 이루는 기호를 확인하세요.

프로그램의 구문 오류는 다음과 같습니다. 종종 기호 누락으로 인해 발생합니다. 스택을 사용하여 기호가 쌍을 이루는지 확인할 수 있습니다. 빈 스택을 만듭니다. 문자가 열린 기호('({['))인 경우 해당 기호가 닫힌 기호(')]}')인 경우 스택에 오류가 보고됩니다. 비어 있으며 '()}' 오류에 해당합니다. 그렇지 않으면 팝된 기호가 해당 열린 기호가 아닌 경우 '(}' 오류에 해당하는 오류가 보고됩니다. 파일 끝에서 스택이 비어 있으면 오류가 발생합니다. '({}' 오류에 해당합니다.

def match(i,j):
    opens='([{'
    closes=')]}'
    return opens.index(i)==closes.index(j)
def syntaxChecker(string):
    stack=Stack()
    balanced=True
    for i in string:
        if i in '([{':
            stack.push(i)
        elif i in ')]}':
            if stack.isEmpty():
                balanced=False
                break
            else:
                j=stack.pop()
                if not match(j,i):
                    balanced=False
                    break
    if not stack.isEmpty():
        balanced=False
    return balanced

1.2.2 십진수 변환

십진수를 이진수로 변환: 몫이 0이 될 때까지 십진수를 이진수로 변환합니다. 읽기 시작 왼쪽 아래 숫자부터 읽어보세요.

알고리즘을 이용한 문제 해결에서 시작해서 오른쪽 숫자를 읽어보세요. 데이터 구조" 그림:

Python 데이터 구조 - 스택 및 큐 구현 (1)

코드:

def decimal_to_bin(dec):
    stack=Stack()
    cur=dec
    while cur>0:
        a=cur%2
        cur=cur/2
        stack.push(a)
    binstr=''
    while not stack.isEmpty():
        binstr+=str(stack.pop())
    return binstr


1.2.3 접미사 표기

후위 표기법(postfix)은 ​​스택을 사용합니다. 숫자를 보면 스택에 푸시됩니다. 연산자를 만나면 스택에서 팝된 두 요소에 대해 작동하고 결과를 스택에 팝합니다.

(7+8)/(3+2)는 7 8 + 3 2 + /

"알고리즘 및 데이터 구조를 사용한 문제 해결"의 그림:

Python 데이터 구조 - 스택 및 큐 구현 (1)

중위에서 접미사로 변환: 피연산자를 읽으면 출력에 넣습니다. 연산자 (+,-,*,/)를 읽을 때 스택이 비어 있으면 스택에 푸시하고, 그렇지 않으면 스택 요소를 팝하여 우선 순위가 낮은 요소를 찾을 때까지 출력에 넣습니다. '('를 읽은 후 스택에 푸시하고, ')'를 읽으면 스택 요소를 팝하고 '('를 찾을 때까지 출력으로 보냅니다. 마지막에는 스택이 빌 때까지 스택 요소를 팝합니다.

"알고리즘과 데이터 구조를 이용한 문제 해결"의 사진:

Python 데이터 구조 - 스택 및 큐 구현 (1)

def infixtoPostfix(infix):
    a={}
    a['*']=3
    a['/']=3
    a['+']=2
    a['-']=2
    a['(']=1
    stack=Stack()
    post=''
    for i in infix:
        if i not in a and i!=')':
            post+=i
        elif i=='(':
            stack.push(i)
        elif i==')':
            top=stack.pop()
            while top!='(':
                post+=top
                top=stack.pop()
        else:          
            while not stack.isEmpty() and a[i]<=a[stack.peek()]:
                post+=stack.pop()
            stack.push(i)
    while not stack.isEmpty():
        post+=stack.pop()
    return post
                   
def postfixExp(postfix):
    stack=Stack()
    postlist=postfix.split()
    for i in postlist:
        if i not in &#39;+-*/&#39;:
            stack.push(i)
        else:
            a=stack.pop()
            b=stack.pop()
            result=math(i,b,a)
            stack.push(result)
    return stack.pop()
def math(x,y,z):
    if x==&#39;+&#39;:
        return float(y)+float(z)
    if x==&#39;-&#39;:
        return float(y)-float(z)
    if x==&#39;*&#39;:
        return float(y)*float(z)
    if x==&#39;/&#39;:
        return float(y)/float(z)

2 Queue

Queue(queue)도 테이블, 사용 큐 삽입과 삭제는 서로 다른 끝에서 수행됩니다. 큐의 기본 작업은 테이블 끝(후면)에 요소를 삽입하는 Enqueue(enqueue)와 해당 요소를 삭제하는 Dequeue(Dequeue)입니다. 🎜>

위는 Python 데이터 구조 - 스택 및 큐 구현 내용입니다. (1) 관련 기사를 더 보려면 PHP 중국어 웹사이트(www.php.cn)를 참고하세요. )
class Queue(object):
    def __init__(self):
        self.queue=[]
    def isEmpty(self):
        return self.queue==[]
    def enqueue(self,x):
        self.queue.append(x)
    def dequeue(self):
        if self.queue:
            a=self.queue[0]
            self.queue.remove(a)
            return a
        else:
            raise IndexError,&#39;queue is empty&#39;
    def size(self):
        return len(self.queue)

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.