代码1:
#用数组实现栈的数据结构
class Stack
def initialize #栈的初始化
@store=[] #空数组
end
def pop #出栈
@store.pop
end
def push(x) #入栈
@store.push x
end
def peek #栈顶元素
@store.last
end
def empty? #栈是否为空
@store.empty?
end
end
def initialize #栈的初始化
@store=[] #空数组
end
def pop #出栈
@store.pop
end
def push(x) #入栈
@store.push x
end
def peek #栈顶元素
@store.last
end
def empty? #栈是否为空
@store.empty?
end
end
def match(peek,char) #判断栈顶元素与')',']','}'的匹配情况
case char
when ')'
peek=='('
when ']'
peek=='['
when '}'
peek=='{'
end
end
case char
when ')'
peek=='('
when ']'
peek=='['
when '}'
peek=='{'
end
end
puts "Please input an expression:"
str=gets.chomp
a=str.scan(/./) #将得到的字符串转换为数组
stack=Stack.new #新建栈
a.each do |char| #字符串中的字符进行迭代
if char=~/\(|\{|\[/ #与'(','[','{'匹配
stack.push(char) #进栈
elsif char=~/\)|\]|\}/ #如果出现与')',']','}'匹配的字符
if match(stack.peek,char) #判断栈顶元素与字符的是否对应
stack.pop #出栈
end
end
end
puts stack.empty? #如果栈空,匹配
a=str.scan(/./) #将得到的字符串转换为数组
stack=Stack.new #新建栈
a.each do |char| #字符串中的字符进行迭代
if char=~/\(|\{|\[/ #与'(','[','{'匹配
stack.push(char) #进栈
elsif char=~/\)|\]|\}/ #如果出现与')',']','}'匹配的字符
if match(stack.peek,char) #判断栈顶元素与字符的是否对应
stack.pop #出栈
end
end
end
puts stack.empty? #如果栈空,匹配
对于字符串的迭代,并不是str.each就可以实现对字符串中每一个字符迭代的效果。而each_byte的作用是将字符串中的每一个字符的ascii代码对应的整数。譬如
"abc".each_byte do |ele|
puts "value: #{ele}, class: #{ele.class} "
end
puts "value: #{ele}, class: #{ele.class} "
end
结果是:
value: 97 , class: Fixnum
value: 98 , class: Fixnum
value: 99 , class: Fixnum
所以要实现对字符串中每一个字符的迭代,要首先将字符串转化为字符数组
a=str.scan(/./)
本文转自 fsjoy1983 51CTO博客,原文链接:http://blog.51cto.com/fsjoy/115748,如需转载请自行联系原作者