表达式求值
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)
火车调度
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
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( )
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) )