今天,开始在leetcode上面开始做题,第一个题目是:

Implement a basic calculator to evaluate a simple expression string.

The expression string contains only non-negative integers, +-*/ operators and empty spaces . The integer division should truncate toward zero.

You may assume that the given expression is always valid.

Some examples:

  "3+2*2" = 7
  " 3/2 " = 1
  " 3+5 / 2 " = 5
主要思想,先将中缀表达式利用“栈”和“队列”,转换为后缀表达式,其实难点也主要在这里,再计算后缀表达式的值。

首先构造“栈”:

stack.py

class Stack():
def __init__(self, size):
self.size = size
self.top = -1
self.stack = [] def push(self, ele):
if self.isfull():
raise Exception("out of range")
else:
self.stack.append(ele)
self.top += 1 def isfull(self):
if self.top == self.size - 1:
return True
else:
return False def pop(self):
if self.isEmpty():
raise Exception("no element")
else:
self.top -= 1
return self.stack.pop() def isEmpty(self):
if self.top == -1:
return True
else:
return False def returnFristEle(self):
return self.stack[self.top] def returnStack(self):
return self.stack if __name__ == '__main__':
s = Stack(1) for i in xrange(3):
s.push(i)
print s.stack, s.top

接下来,需要构造“队列”:

__author__ = 'Administrator'

class Queue():
def __init__(self, size):
self.size = size
self.queue = []
self.top = -1 def push(self, ele):
if not self.isFull():
self.queue.append(ele)
self.top += 1 else:
raise Exception("out of range") def isFull(self):
if self.top == self.size - 1:
return True
else:
return False def isEmpty(self):
if self.size == self.top:
return True
else:
return False def pop(self):
if self.isEmpty():
raise Exception("no element")
else:
ele = self.queue.pop(0)
return ele def returnQueue(self):
return self.queue if __name__ == '__main__':
queue = Queue(10) for i in xrange(5):
queue.push(i) print queue.pop(), queue.queue

然后,就是计算器的整个主程序:

#python
#coding=utf-8
from stack import Stack
from queue import Queue class RailExpress():
def __init__(self, express):
self.fontExpress = express
self.railExpress = []
self.size = len(express)
self.stack = Stack(self.size)
self.queue = Queue(self.size) self.level = {'+': 1, '-': 1, '*': 2, '/': 2, '(': 3, ')': 3}
self.operators = ['+', '-', '*', '/', '(', ')'] self.makeRailExpress() def makeRailExpress(self):
for i in self.fontExpress:
if i in self.operators:
if i is self.operators[-1]:
ele = self.stack.pop() while ele is not self.operators[-2]:
self.queue.push(ele)
ele = self.stack.pop() if self.stack.isEmpty():
break elif i is self.operators[-2]:
self.stack.push(i) else:
if not self.stack.isEmpty():
while self.stack.returnFristEle() is not self.operators[-2] and self.level[self.stack.returnFristEle()] >= self.level[i]:
ele = self.stack.pop()
self.queue.push(ele) if self.stack.isEmpty():
break self.stack.push(i)
else:
self.queue.push(i) if not self.stack.isEmpty():
stack = self.stack.returnStack()
stack.reverse()
self.queue.returnQueue().extend(stack) class CheckExpress():
def __init__(self, express):
if len(express) > 10000:
sys.exit(0)
self.express = express def checkExpress(self):
express = []
count = -1 for each in self.express:
if (each >= '0') and (each <= '9') or (each == '.'):
length = len(express)
if length == 0:
express.append(each)
count += 1 elif (express[count] >= '0') and (express[count] <= '999999') or (each == '.'):
length = len(express)
express[length - 1] = express[length - 1] + each
else:
express.append(each)
count += 1
else:
if each == '+' or each == '-' or each == '*' or each == '/' or each == '(' or each == ')':
express.append(each)
count += 1 return express class Calculator():
def __init__(self, express):
self.express = express
size = len(express)
self.stack = Stack(size)
self.result = None self.operatorRailExpress() def operatorRailExpress(self):
for each in self.express:
if (each >= '0') and (each <= '999999'):
self.stack.push(each) else:
twoOperator = self.stack.pop()
oneOperator = self.stack.pop()
temp = self.calculator(oneOperator, twoOperator, each) self.stack.push(temp) self.result = self.stack.returnFristEle() def calculator(self, one, two, operator):
operatorDict = {'+': self.plus, '-': self.reduction, '*': self.multiplicate, '/': self.devision}
temp = operatorDict[operator](one, two) return temp def plus(self, one, two):
return float(one)+float(two) def reduction(self, one, two):
return float(one)-float(two) def multiplicate(self, one, two):
return float(one)*float(two) def devision(self, one, two):
return float(one)/float(two) class ConnectView():
def __init__(self, model):
self._model = model def calculator(self):
express = CheckExpress(self._model.result).checkExpress()
if len(express) == 1:
sys.exit(0) rail = RailExpress(express)
queue = rail.queue.returnQueue()
if len(queue) == 1: sys.exit(0)
calculate = Calculator(queue)
self._model.result = str(calculate.result) import sys
if __name__ == '__main__':
express = raw_input('输入表达式:') express = CheckExpress(express).checkExpress()
if len(express) == 1:
sys.exit(0) rail = RailExpress(express)
queue = rail.queue.returnQueue()
if len(queue) == 1:
print int(queue[0])
sys.exit(0)
calculate = Calculator(queue)
print calculate.result
 

上面代码分析如下:

1.中缀表达式转后缀表达式的方法:
⑴.遇到操作数:直接输出(添加到后缀表达式中)
⑵.栈为空时,遇到运算符,直接入栈
⑶.遇到左括号:将其入栈
⑷.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。
⑸.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈
⑹.最终将栈中的元素依次出栈,输出。

2.首先解释CheckExpress,这个函数主要是将表达式中的改为标准的表达式,将每个元素加入列表中,这里的每个元素只包括“数字”和“+-*/”,空格或者其它的字符会自动过滤。当只输入一个有效字符时,就会终止程序。

3.RailExpress就是求后缀表达式,程序部分的核心;

4.Calculator就是计算后缀表达式的值。

  在此基础上,鄙人用GTK,写了一个简易的计算器界面。算是给这个计算器程序,结了一个尾。界面程序就不贴了~~有意者我们可以私聊~~~嘿嘿·

  由于新手一枚,代码质量确实有限。但是,人都是在不断的磨砺中成长,欢迎大家吐槽~~~

简易计算器-leetcode的更多相关文章

  1. 自制c#简易计算器

    这是一个课堂作业,我觉得作为一个简易的计算器不需要态度复杂的东西,可能还有一些bug,有空再慢慢加强. using System;using System.Collections.Generic;us ...

  2. 剖析简易计算器带你入门微信小程序开发

    写在前面,但是重点在后面 这是教程,也不是教程. 可以先看Demo的操作动图,看看是个什么玩意儿,GitHub地址(https://github.com/dunizb/wxapp-sCalc) 自从微 ...

  3. PHP学习笔记02——简易计算器

    <!DOCTYPE html> <html> <head> <title>PHP简易计算器</title> </head> &l ...

  4. JavaScript之简易计算器

    <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...

  5. 菜鸟学习Struts——简易计算器

    这是学习Struts的一个简单的例子文件结构如下: 1.配置Struts环境 2.新建input.jsp,success.jsp,error.jsp input.jsp代码如下: <%@ pag ...

  6. Python之实现一个简易计算器

    自己动手写计算器 一.功能分析 用户输入一个类似这样 3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4) 这样的表达式,假设表达式里 ...

  7. 使用HTML+CSS,jQuery编写的简易计算器

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  8. 使用HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)

    之前发布了一款简易的计算器,今天做了一下修改,添加了键盘监听事件,不用再用鼠标点点点啦 JS代码: var yunSuan = 0;// 运算符号,0-无运算;1-加法;2-减法;3-乘法;4-除法 ...

  9. C#Windows Form简易计算器实现(中)

    昨天花了一天的时间弄计算器.也算是做出来了,还是简易的(怀疑猿生!!).在此先感谢昨天被我骚扰的朋友. 先贴一张界面看看 其实健壮性还是挺差的,用户体验也是极差的.比如说用户输入了不合理运算式子,我就 ...

随机推荐

  1. vscode 遇到 TabError: inconsistent use of tabs and spaces in indentation

    Python开发,全靠缩进来控制Scope.缩进搞错了,代码也就有问题了.所以写着代码的时候,总是会遇到一个非常常见的问题.TabError: inconsistent use of tabs and ...

  2. postgresql获取表最后更新时间(通过触发器将时间写入另外一张表)

    通过触发器方式获取表最后更新时间,并将时间信息写入到另外一张表 一.创建测试表和表记录更新时间表 CREATE TABLE weather( city varchar(80), temp_lo int ...

  3. jwt扩展

    1.新建扩展类 package com.ireciting.uaaservice.config; import com.ireciting.uaaservice.pojo.TUser; import ...

  4. ios-Realm数据库的使用

    [集成 Realm] 本 Demo 使用 OC 创建,所以先进入 Realm 官网 (我记得之前都是有官方中文教程的,但现在最新版没有中文了),到 Objective-C -> Getting ...

  5. leetcode探索高级算法

    C++版 数组和字符串 正文 链表: 正文 树与图: 树: leetcode236. 二叉树的最近公共祖先 递归(先序) leetcode124二叉树最大路径和 递归 图: leetcode 547朋 ...

  6. Python3+RobotFramewok 快速入门(二)

    1. 原理 首先解释一下RF的工作原理,官方文档介绍就不赘述了,笔者就框架架构做出一个更加具体的描述 测试套及测试用例集(Test Data即需要用户编写的脚本)通过RF特定的语法解析,然后知道用户要 ...

  7. Centos安装openjdk

    转载自:https://blog.csdn.net/youzhouliu/article/details/51183115 openjdk在linux各个平台下安装源中可以找到. 命令查找安装源中有什 ...

  8. Java泛型(6):extends和super关键字

    (1) <T extends A> 因为擦除移除了类型信息,而无界的泛型参数调用的方法只等同于Object.但是我们可以限定这个泛型参数为某个类型A的子集,这样泛型参数声明的引用就可以用类 ...

  9. 【并行计算-CUDA开发】浅谈GPU并行计算新趋势

    随着GPU的可编程性不断增强,GPU的应用能力已经远远超出了图形渲染任务,利用GPU完成通用计算的研究逐渐活跃起来,将GPU用于图形渲染以外领域的计算成为GPGPU(General Purpose c ...

  10. day24 类的初始化、绑定方法、继承

    今日内容 1.初始化函数 2.绑定方法与非绑定方法 3.绑定方法的特殊之处 4.类的继承 一.初始化函数 1.什么是初始化函数 我们在使用类创建对象时,创建出来的对象都会拥有类中的属性和方法,但是每个 ...