python队列排序_python 栈和队列 排序 初级数据结构

编写一个类,具有栈和队列的功能。实现以下4个方法:

shit()       返回并删除列表中第一个元素

unshit()   在列表的头部‘压入’一个新的元素

push()    在列表尾部增加一个元素

pop()      返回并删除最后一个元素

outAllData() 输出所有的数据

classstackAndQueue(object):

data=[]defisEmpty(self):return len(self.data)==0defshift(self):ifstackAndQueue.isEmpty(self):print 'the operator is illegal'

else:

ret=self.data[0]delself.data[0]returnretdefunshift(self, val):

self.data.insert(0, val)defpush(self, val):

self.data.append(val)defpop(self):ifstackAndQueue.isEmpty(self):print 'the operator is illegal'

else : returnself.data.pop()defoutAllData(self):print ' '.join( map(str, self.data) )

快速排序:

defquickSort(num):if num ==[]:return[]

n=len(num)return quickSort([num[i] for i in xrange(1, n) if num[i]<=num[0] ]) + [num[0]] + quickSort([num[i] for i in xrange(1, n) if num[i]>num[0] ])defmain():

l1= [9, 8, 7, 5, 4, 1, 7, 56, 34]

l2=quickSort(l1)printl1printl2if __name__ == '__main__':

main()

选择排序:

defselection_sort(L):

Len=len(L)for i inxrange(Len):

smallest=find_min(L, i)

L[i], L[smallest]=L[smallest], L[i]deffind_min(L, b):

smallest=b

Len=len(L)for i inxrange(b, Len):if L[i]

smallest=ireturnsmallestdefmain():

l1= [6, 5, 4, 3, 2, 2, 9, -3, 56]print 'before sort', l1

selection_sort(l1)print 'after sort',l1if __name__ == '__main__':

main()

插入排序

definsertion_sort(L):

Len=len(L)for i in xrange(1,Len):

insert(L, i)definsert(L, b):

Len=len(L)

i=bwhile (L[i-1] > L[i]) and (i-1>=0):

L[i-1], L[i] = L[i], L[i-1]

i-= 1

defmain():

l1= [6, 5, 4, 3, 2, 2, 9, -3, 56]print 'before sort', l1

insertion_sort(l1)print 'after sort',l1if __name__ == '__main__':

main()

另外一个版本,使用bisect模块实现。bisect模块有以下几个方法: 这些方法返回的都是位置信息

bisect(x) 默认是bisect_right(a, x)

bisect_left(a, x)  在有序序列里查找第一个大于x的位置,如果有与x相同的元素,则返回与x相等元素中最左边的那个位置

bisect_right(a, x) 在有序序列里查找第一个大于x的位置,如果有与x相同的元素,则返回与x相等元素中最右边的那个位置

insort 默认是insort_right(a, x)

insort_left(a, x)   在有序序列里插入x,如果有与x相同的元素,则当前元素插入在这些相同元素的最左边

insort_right(a, x) 在有序序列里插入x,如果有与x相同的元素,则当前元素插入在这些相同元素的最右边

importbisectdefbin_sort(values):'''sort values , creating a new list'''result=[]for v invalues:

bisect.insort_left(result, v)returnresultdefmain():

l1= [6, 5, 4, 3, 2, 2, 9, -3, 56]print 'before sort', l1

l1=bin_sort(l1)print 'after sort',l1if __name__ == '__main__':

main()

合并排序(递归版)

defmergesort(L):if len(L) < 2: returnL

mid= (len(L))>>1L1=mergesort(L[:mid])

L2=mergesort(L[mid:])returnmerge(L1, L2)defmerge(L1, L2):

newL=[]

i1= i2 =0

Len1, Len2=len(L1), len(L2)while i1!=Len1 and i2!=Len2:if L1[i1] <=L2[i2]:

newL.append(L1[i1])

i1+= 1

else:

newL.append(L2[i2])

i2+= 1newL.extend(L1[i1:])

newL.extend(L2[i2:])returnnewLdefmain():

l1= [6, 5, 4, 3, 2, 2, 9, -3, 56]print 'before sort', l1

l1=mergesort(l1)print 'after sort',l1if __name__ == '__main__':

main()

合并排序(非递归版)

defmergesort(L):'''segNum 未合并的序列数

segLength 每个序列的长度,不包括最后那段

lastSegLength 最后那短的长度,这个是不确定的'''segNum, segLength, lastSegLength= len(L), 1, 1

while segNum > 1:

tmp_segNum=segNum

segNum>>= 1tmp_segLength= segLength<<1

if tmp_segNum&1:

j=0for i inxrange(segNum):

merge(L, j, j+segLength,j+tmp_segLength)

j+=tmp_segLength

j= len(L)-lastSegLength-tmp_segLength+1merge(L, j, j+tmp_segLength, len(L))else:

j=0for i inxrange(segNum):if i != (segNum-1):

merge(L, j, j+segLength, j+tmp_segLength)else:

merge(L, j, j+segLength, len(L))

j+=tmp_segLength

lastSegLength+=segLength

segLength=tmp_segLengthdefmerge(L, s, mid, t):

tmp=[]

i1, i2=s, midwhile i1!=mid and i2!=t:if L[i1]<=L[i2]:

tmp.append(L[i1])

i1+= 1

else:

tmp.append(L[i2])

i2+= 1tmp.extend(L[i1:mid])

tmp.extend(L[i2:t])for i in xrange(t-1, s-1, -1):

L[i]=tmp.pop()defmain():

l1= [6, 5, 4, 3, 2, 2, 9, -3, 56]print 'before sort', l1

mergesort(l1)print 'after sort', l1if __name__ == '__main__':

main()

表达式的计算,带括号:

ss =raw_input().strip()

Len=len(ss)

info, sign=[], []defisdigit(x):return True if ord('0')<=ord(x)<=ord('9') elseFalsedefcount():

b, a=info.pop(), info.pop()

op=sign.pop()if op=='+': a +=belif op=='-': a -=belif op=='*': a *=belif op=='/': a /=b

info.append(a)

i=0while i

tmp=0while i

sign.pop()elif ss[i]=='+' or ss[i]=='-':while sign and sign[-1]!='(': count()

sign.append(ss[i])elif ss[i]=='*' or ss[i]=='/':while sign and sign[-1]!='(' and sign[-1]!='+' and sign[-1]!='-': count()

sign.append(ss[i])

i+= 1

whilesign: count()print info[0]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值