【代码】草稿箱,无用且不完整,请忽略13【栈】

表达式求值

#栈的基本操作
def stackinit():
#栈的初始化
    return []

def enstack(sta,d):
#元素进栈
    sta.append(d)

def destack(sta):
#元素出栈,删除栈顶的元素
    return sta.pop()
#删除并返回最后一个元素

def emptystack(sta):
#栈判空
    return len(sta)==0

sta1=stackinit()
sum=0
s=input()
for i in range(len(s)):
    if s[i] !='+' and s[i] !='*' and s[i-1]!='*':
        enstack(sta1,int(s[i]))
    elif s[i]=='*':
        n=destack(sta1)
        n=n*int(s[i+1])
        enstack(sta1,n)
while (len(sta1)!=0):
    sum+=destack(sta1)
print (sum)

程序员输入问题

'''210、程序员输入问题
【问题描述】
程序员输入程序出现差错时,可以采取以下的补救措施:按错了一个键时,可以补按一个退格符“#”,
以表示前一个字符无效;发现当前一行有错,可以按一个退行符“@”,以表示“@”与前一个换行符之间的字符
全部无效。
【输入格式】
输入一行字符,个数不超过 100。
【输出格式】
输出一行字符,表示实际有效字符。
【输入样例】
          sdfosif@for(ii#=1,#;i<.#=8;i+++#);
【输出样例】
          for(i=1;i<=8;i++);
'''
#栈的基本操作
def stackinit():
#栈的初始化
    return []
def enstack(sta,d):
#元素进栈
    sta.append(d)
def destack(sta):
#元素出栈,删除栈顶的元素
    return sta.pop()
#删除并返回最后一个元素
def emptystack(sta):
#栈判空
    return len(sta)==0
def gettop(sta):
#获取栈顶元素
    return sta[-1]
s=input("请输入字符串:")
sta1=stackinit()
sta2=stackinit()
for i in range(len(s)):
    enstack(sta1,s[i])
while(emptystack(sta1)!=True):
    d=destack(sta1)
    if  d=='#':
        destack(sta1)
    elif d=='@':
        while(destack(sta1)!='\n' and emptystack(sta1)!=True):
            destack(sta1)
    else:
        enstack(sta2,d)
while(emptystack(sta2)!=True):
    print(destack(sta2),end='')





    

后缀表达式

'''输入一个后缀表达式字符串之后,由左向右依次读取字符
1.读取到数字就直接入栈
2.当读入运算符就直接将栈中前两个数弹出,其中先弹出的为右操作数,后弹出的为左操作数,计算之后将结果压入栈中。
3.直至读取完毕,栈中剩余的数据的就是结果
一定是最终栈中只有一个数据,若是有多个数据则说明输入的后缀表达式有误。
'''
#栈的基本操作
def stackinit():
#栈的初始化
    return []

def enstack(sta,d):
#元素进栈
    sta.append(d)

def destack(sta):
#元素出栈,删除栈顶的元素
    return sta.pop()
#删除并返回最后一个元素

def emptystack(sta):
#栈判空
    return len(sta)==0
sta1=stackinit()
s=input().split(',')
for i in range(len(s)):
    if s[i]!='+'and s[i]!='*':
        enstack(sta1,int(s[i]))
    elif s[i]=='+':
        a=destack(sta1)
        b=destack(sta1)
        enstack(sta1,a+b)
    else:
        a=destack(sta1)
        b=destack(sta1)
        enstack(sta1,a*b)

火车调度

#火车调度
#在火车调度入口共有n节硬席或软席HS,等待调度,现需要把所有的软席车厢调度到硬席车厢之前。
def stackinit():
    return []

def enstack(sta,d):
    sta.append(d)

def destack(sta):
#出栈,删除栈顶元素
    return sta.pop()

def emptystack(sta):
#判栈是否为空
    return len(sta)==0

def gettop(sta):
#获取栈顶元素
    return sta[-1]

trailstack,softstack,hardstack = stackinit(),stackinit(),stackinit()
#初始化三个栈
s = "HSHHSHHHSSS"
for i in range(len(s)):
#将所有列车入栈
    enstack(trailstack,[s[i],i])
    print("编号",i,"车厢",s[i],"进站")

while emptystack(trailstack) == False:
#当火车栈不空时:分别将栈顶元素加入对应栈
    d = destack(trailstack)
    if d[0] == 'H':
        enstack(hardstack,d)
        print("编号",d[1],"车厢",d[0],"进hardstack轨道")
    else:
        enstack(softstack,d)
        print("编号",d[1],"车厢",d[0],"进softstack轨道")

while emptystack(hardstack) == False:
#当硬席栈不空时,将硬席栈中的元素出栈并加入列车栈
    d = destack(hardstack)
    enstack(trailstack,d)
    print("编号",d[1],"车厢",d[0],"出hardstack轨道,进站")

while emptystack(softstack) == False:
#当软席栈中不为空时,将软席栈中的元素出栈,并加入列车栈
    d = destack(softstack)
    enstack(trailstack,d)
    print("编号",d[1],"车厢",d[0],"出softstack轨道,进站")

print(trailstack)

括号匹配—不使用flag

def initstack():
    return []
def enstack(stack,d):
    stack.append(d)
def destack(stack):
    return stack.pop()
def emptystack(stack):
    return len(stack)==0

#不使用flag,最后根据栈是否为空来进行判断
s=input("请输入数学公式:")
stack=initstack()
for i in range(len(s)):
    if s[i]=='(':
        enstack(stack,s[i])
    elif s[i]==')':
        if emptystack(stack):
            print("括号不匹配")
            break
        else:
            destack(stack)
else:
    if emptystack(stack):
        print("括号匹配")
    else:
        print("括号不匹配")
 

括号匹配——使用flag

def stackinit():
#栈的初始化
    return []

def enstack(sta,d):
#进栈
    sta.append(d)

def  destack(sta):
#出栈
    return sta.pop()
#pop函数默认删除最后一个元素并返回

def emptystack(sta):
#判空
    return True if len(sta)==0 else False

s = input("请输入数学公式:")
sta = stackinit()
flag = True
#栈中只储存左括号,用右括号进行判断,若栈为空,则不匹配,若不为空,则删除一个左括号
for i in range(len(s)):
    if s[i] == "(":
        enstack(sta,s[i])
    elif s[i] == ")":
        if emptystack(sta):
            flag = False
            break
        else:
            destack(sta)

if flag==False or emptystack(sta)==False:
    print("括号不匹配!")
else:
    print("括号匹配!")


前缀表达式求值

'''从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,
用运算符对它们做相应的计算(栈顶元素 op 次顶元素),
并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果'''
#栈的基本操作
def stackinit():
#栈的初始化
    return []

def enstack(sta,d):
#元素进栈
    sta.append(d)

def destack(sta):
#元素出栈,删除栈顶的元素
    return sta.pop()
#删除并返回最后一个元素

def emptystack(sta):
#栈判空
    return len(sta)==0
s=input().split()
sta1=stackinit()
n=len(s)
while(n>0):
    if s[n-1] in ['0','1','2','3','4','5','6','7','8','9']:
        enstack(sta1,int(s[n-1]))
    if s[n-1]=='+':
        a=destack(sta1)
        b=destack(sta1)
        enstack(sta1,a+b)
    if s[n-1]=='-':
        a=destack(sta1)
        b=destack(sta1)
        enstack(sta1,a-b)
    if s[n-1]=='*':
        a=destack(sta1)
        b=destack(sta1)
        enstack(sta1,a*b)
    if s[n-1]=='/':
        a=destack(sta1)
        b=destack(sta1)
        enstack(sta1,a/b)
    n-=1
print (destack(sta1))

溶液模拟器

'''【问题描述】
小谢虽然有很多溶液,但是还是没有办法配成想要的溶液,因为万一倒错了就没有办法挽回了。因此,小谢到网上下载了一个溶液配置模拟器。模拟器在计算机中构造一种虚拟溶液,然后可以虚拟地向当前虚拟溶液中加入一定浓度、一定体积的这种溶液,模拟器会快速地算出倒入后虚拟溶液的浓度和体积。当然,如果倒错了可以撤销。
模拟器的使用步骤如下:
1)为模拟器设置一个初始体积和浓度 V0、C0%。
2)进行一系列操作,模拟器支持两种操作:
P(v,c)操作:表示向当前的虚拟溶液中加入体积为 v 浓度为 c 的溶液;
Z 操作:撤销上一步的 P 操作。
【输入格式】
第一行两个整数,表示 V0 和 C0,0≤C0≤100;
第二行一个整数 n,表示操作数,n≤10000;
接下来 n 行,每行一条操作,格式为:P_v_c 或 Z。
其中 _ 代表一个空格,当只剩初始溶液的时候,再撤销就没有用了。
【输出格式】
n 行,每行两个数 Vi,Ci,其中 Vi 为整数,Ci 为实数(保留 5 位小数)。
其中,第 i 行表示第 i 次操作以后的溶液体积和浓度。
【输入样例】
100 100
2
P 100 0
Z
【输出样例】
200 50.00000
100 100.00000
'''
#栈的基本操作
def stackinit():
#栈的初始化
    return []
def enstack(sta,d):
#元素进栈
    sta.append(d)
def destack(sta):
#元素出栈,删除栈顶的元素
    return sta.pop()
#删除并返回最后一个元素
def emptystack(sta):
#栈判空
    return len(sta)==0
def gettop(sta):
    return sta[-1]
vsta=stackinit()
csta=stackinit()
sign_stack=stackinit()
s1=input().split()
v0=int(s1[0])
c0=int(s1[1])
enstack(vsta,v0)
enstack(csta,c0)

n=int(input())
for i in range(n):
    s2=input().split()
    if s2[0]=='Z':
        if emptystack(sign_stack)!=True:
            destack(vsta)
            destack(csta)
            destack(sign_stack)
    else:
        enstack(sign_stack,s2[0])
        enstack(csta,(int(s2[2])*int(s2[1])+gettop(csta)*gettop(vsta))/(gettop(vsta)+int(s2[1])))
        enstack(vsta,gettop(vsta)+int(s2[1]))

栈的基础操作

#栈的基本操作
def stackinit():
#栈的初始化
    return []

def enstack(sta,d):
#元素进栈
    sta.append(d)

def destack(sta):
#元素出栈,删除栈顶的元素
    return sta.pop()
#删除并返回最后一个元素

def emptystack(sta):
#栈判空
    return len(sta)==0

栈实现进制转换——非递归

def stackinit():
    return []

def enstack(sta,d):
    sta.append(d)

def  destack(sta):
    return sta.pop()

def emptystack(sta):
    return len(sta)==0

num = 1348
r = 8
sta = stackinit()
while(num != 0):
    enstack(sta,num%r)
    num = num // r
    
while(emptystack(sta) == False):
    print(destack(sta),end="")

中缀转前缀


#栈的基本操作
def stackinit():
#栈的初始化
    return []

def enstack(sta,d):
#元素进栈
    sta.append(d)

def destack(sta):
#元素出栈,删除栈顶的元素
    return sta.pop()
#删除并返回最后一个元素

def emptystack(sta):
#栈判空
    return len(sta)==0
def gettopstack(sta):#  获取栈顶元素
    return sta[-1]
op_dict={')':4,'*':3,'/':3,'+':2,'-':2,'(':1}
s1=stackinit()
s2=stackinit()
s=input()
for i in range(len(s)):
    if s[0-i-1] in  ['0','1','2','3','4','5','6','7','8','9']:
        enstack(s2,int(s[0-i-1]))
    if s[0-i-1] in ['*','/','+','-']:
        if emptystack(s1)==True or gettopstack(s1)==')':
            enstack(s1,s[0-i-1])
        elif op_dict[s[0-i-1]]>=op_dict[gettopstack(s1)]:
            enstack(s1,s[0-i-1])
        else:
                enstack(s2,destack(s1)) 
    if s[0-i-1]==')':
        enstack(s1,s[0-i-1])
    if s[0-i-1]=='(':
        while gettopstack(s1)!=')':
            enstack(s2,destack(s1))
        destack(s1)
while emptystack(s1)!=True:
    enstack(s2,destack(s1))





            

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值