算法 1.3.1 堆栈计算器词法分析器

首先我们做一个硬核的设计:

然后丢入python代码:

class mathss:
    def __init__(self,string):
        import queue
        self.string=string+"#"
        self.number=[i for i in ".0123456789"]
        self.charr=[['#'],['+','-'],['*','/'],['('],[')']]
        self.KUO=0
        self.queue1=queue.LifoQueue()
        self.queue2=queue.LifoQueue()
        self.all()
    def get_string(self):
        k=1
        u=0
        while self.string[u:u+1] in self.number:
            u+=1
        if u==0:
            u=1
            k=2
        litter=self.string[:u]
        self.string=self.string[u:]
        return litter,k
    def get_list(self,get_word):
        hh=[]
        hh.append(get_word[0])
        if get_word[0] in self.charr[0]:hh.append(0)
        if get_word[0] in self.charr[1]: hh.append(1+self.KUO)
        if get_word[0] in self.charr[2]: hh.append(2+self.KUO)
        if get_word[0] in self.charr[3]:self.KUO=self.KUO+10;hh.append(self.KUO)
        if get_word[0] in self.charr[4]: hh.append(self.KUO);self.KUO=self.KUO-10;
        return hh



    def A(self):
        yy=['#',0]
        self.queue2.put(yy)

    def B(self):
        get_word=self.get_string()
        print(get_word)
        if get_word[1]==1:
            self.queue1.put(float(get_word[0]))
        if get_word[1]==2:
            self.C(get_word)

    def C(self,get_word):
        newcharlist=self.get_list(get_word)
        oldcharlisr=self.queue2.get()
        if newcharlist[1]>oldcharlisr[1]:
            self.queue2.put(oldcharlisr)
            self.queue2.put(newcharlist)
        else:
            if newcharlist[0]=='#' and oldcharlisr[0]=='#':
                pass
            elif newcharlist[0]==')' and oldcharlisr[0]=='(':
                pass
            else:
                if get_word[0] == '(':
                    self.KUO = self.KUO - 10;
                if get_word[0] == ')':
                    self.KUO = self.KUO + 10;
                self.string=get_word[0]+self.string
                num2=self.queue1.get()
                num1=self.queue1.get()
                if oldcharlisr[0]=='+':self.queue1.put(num1+num2)
                if oldcharlisr[0] == '-': self.queue1.put(num1 - num2)
                if oldcharlisr[0] == '*': self.queue1.put(num1*num2)
                if oldcharlisr[0] == '/': self.queue1.put(num1 / num2)
                numm=self.queue1.get()
                print(numm)
                self.queue1.put(numm)
    def all(self):
        self.A()
        while not self.queue2.empty():
            self.B()
        print("\n》》》结果为:",self.queue1.get())



y=mathss("((%s/%s)+%s*%s)+((1/3+6)/3)*(2.9)"%(10.1,3.1,3.1415,5536,))
y=mathss("1*2*3*4*5/6/7/8/9")

结果如下:

('(', 2)
('(', 2)
('10.1', 1)
('/', 2)
('3.1', 1)
(')', 2)
3.258064516129032
(')', 2)
('+', 2)
('3.1415', 1)
('*', 2)
('5536', 1)
(')', 2)
17391.344
(')', 2)
17394.60206451613
(')', 2)
('+', 2)
('(', 2)
('(', 2)
('1', 1)
('/', 2)
('3', 1)
('+', 2)
0.3333333333333333
('+', 2)
('6', 1)
(')', 2)
6.333333333333333
(')', 2)
('/', 2)
('3', 1)
(')', 2)
2.111111111111111
(')', 2)
('*', 2)
('(', 2)
('2.9', 1)
(')', 2)
('#', 2)
6.122222222222222
('#', 2)
17400.72428673835
('#', 2)

》》》结果为: 17400.72428673835
('1', 1)
('*', 2)
('2', 1)
('*', 2)
2.0
('*', 2)
('3', 1)
('*', 2)
6.0
('*', 2)
('4', 1)
('*', 2)
24.0
('*', 2)
('5', 1)
('/', 2)
120.0
('/', 2)
('6', 1)
('/', 2)
20.0
('/', 2)
('7', 1)
('/', 2)
2.857142857142857
('/', 2)
('8', 1)
('/', 2)
0.35714285714285715
('/', 2)
('9', 1)
('#', 2)
0.03968253968253968
('#', 2)

》》》结果为: 0.03968253968253968

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值