团队:

郭志豪:http://www.cnblogs.com/gzh13692021053/

杨子健:http://www.cnblogs.com/yzj666/

刘森松:http://www.cnblogs.com/lssh/

谭宇森:http://www.cnblogs.com/dalaotan/

GITHUB地址:https://github.com/Sub-key/1/tree/master/app

app功能实现

                       

主要类代码:

CaculateEx.class源代码以及说明如下:

package com.lsf.cal.calc;

import java.util.Stack;

public class CaculateEx {

public String suffix_expression(String expression)//中缀表达式转换后缀表达式(逆波兰式)

{

//Stack<Double> s2=new Stack<Double>();//存放数字栈

Stack<Object> s3=new Stack<Object>();//存放结果栈

Stack<Character> s4=new Stack<Character>();//存放操作符栈

int len=expression.length();//

char c1;

double number;

int m,n=-1;

for(int i=0;i<len;i++)

{

c1=expression.charAt(i);

if(isOprator(c1)||(i==len-1))//如果是运算符,将前面的数数字入s3栈,操作符入s4栈

{

if(i==len-1&&(!isOprator(c1)))//当最后一位且不是操作符时,将前面的数压栈

m=i+1;

else

m=i;

//操作数入栈,向前遍历到下一个运算符,将中间的字符串转化为double

for(int j=i-1;j>=0;j--)

{

if(isOprator(expression.charAt(j)))

{

n=j;

break;

}

n=j-1;

}

if(m!=n+1)//只有当这两个值不等时中间才会有操作数

{

number=Double.parseDouble(expression.substring(n+1,m));

s3.push(number);

}

//运算符入栈

if(i==0&&(c1!='('))//当表达式第一个字符就为运算符且不是左括号时,返回表达式错误

{

return "表达式错误!";

}

else if(isOprator(c1))//且是操作符时

{

while(true)

{

if(s4.isEmpty()||s4.peek()=='('||c1=='(')//如果栈为空或者栈顶元素为(或者c1为(时,则直接将运算符压入栈内

{

s4.push(c1);

break;

}

else if(c1==')')//当c1为)时,依次弹出s4中的运算符并压入s3,直到(,舍弃这一对括号

{

while(s4.peek()!='(')

{

s3.push(s4.pop());

if(s4.isEmpty())//弹出所有不为左括号之后堆栈为空,则表达式不合法

{

return "缺少左括号";

}

}

s4.pop();//弹出(

break;

}

else

{

if(priorityCompare(c1,s4.peek())==1)//判断优先级,优先级高入栈,优先级低将栈顶运算符压入s3

{

s4.push(c1);

break;

}

else

{

s3.push(s4.pop());

}

}

}

}

}

else

continue;

}

while(!s4.isEmpty())//表达式结束后,依次将s4剩下的运算符压入s3

{

if((char)s4.peek()=='(')

return "缺少右括号";

s3.push(s4.pop());

}

return count_result(s3);

}

private int priorityCompare(char c1,char c2)

{

switch(c1)

{

case '+':

case '-':

return (c2 == '*' || c2 == '/' ? -1 : 0);

case '*':

case '/':

return (c2 == '+' || c2 == '-' ? 1 : 0);

}

return 1;

}

//判断字符是否为运算符,是为真,不是为假

private boolean isOprator(Object c) {

// TODO Auto-generated method stub

try

{

char c1=(char)c;

if(c1=='+'||c1=='-'||c1=='*'||c1=='/'||c1=='('||c1==')')

return true;

}

catch (Exception e) {

// TODO: handle exception

return false;

}

return false;

}

private String count_result(Stack<Object> ob) {

// TODO Auto-generated method stub

Stack<Object> s1=new Stack<Object>();//后缀表达式栈

Stack<Double> s2=new Stack<Double>();//操作数栈

//char c1;

//    Stack<Character> s3=new Stack<Character>();//操作符栈

while(!ob.isEmpty())//将传入的栈逆序压入

{

s1.push(ob.pop());

}

while(!s1.isEmpty())

{

if(!isOprator(s1.peek()))//遇到非操作符,压入s2栈

{

s2.push((Double)s1.pop());

}

else

{

s2.push(cout(s2.pop(),s2.pop(),(char)s1.pop()));

}

}

return Double.toString(s2.peek());

}

private Double cout(double s1,double s2,char s3)

{

double result=0;

switch(s3)

{

case '+':

result=s1+s2;

break;

case '-':

result=s1-s2;

break;

case '*':

result=s1*s2;

break;

case '/':

result=s1/s2;

break;

}

return result;

}

}

3.2、核心类(MainActivity)

MainActivity.class源代码如下:

4、运package com.lsf.cal.calc;

import android.support.v7.app.ActionBarActivity;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

public class MainActivity extends ActionBarActivity implements View.OnClickListener {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button caculateButton=(Button)findViewById(R.id.button);

caculateButton.setOnClickListener(this);

Button clearButton=(Button)findViewById(R.id.clear);

clearButton.setOnClickListener(this);

}

@Override

public void onClick(View v) {

EditText editText = (EditText) findViewById(R.id.text);

if(v.getId()==R.id.button) {

CaculateEx caculateEx = new CaculateEx();

String expreString = editText.getText().toString();

expreString = caculateEx.suffix_expression(expreString);

editText.setText(expreString);

}else{

editText.setText("");

}

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.menu_main, menu);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

// Handle action bar item clicks here. The action bar will

// automatically handle clicks on the Home/Up button, so long

// as you specify a parent activity in AndroidManifest.xml.

int id = item.getItemId();

//noinspection SimplifiableIfStatement

if (id == R.id.action_settings) {

return true;

}

return super.onOptionsItemSelected(item);

}

}

四则运算app代码上传GITHUB的更多相关文章

  1. git使用之如何将github库下载到本地与如何将代码上传github

    git使用之如何将github库下载到本地与如何将代码上传github ---------------------------------------------------------------- ...

  2. eclipse 代码上传github 笔记

    第一步 先share project 如图所示  第二步 如果所示  第三步 点击 下面的create 然后点击完成  第四步提交  第五步: 第六步: 

  3. 把上传Github的代码添加Cocoapods支持

    开始 这里我将从最初的开始进行介绍,包括Github上创建项目已经上传项目,到最后的支持Cocoapods. 步骤如下: 代码上传Github 创建podspec文件,并验证是否通过 在Github上 ...

  4. 一步一步实现android studio代码上传到github。

    本文只注重代码上传能成功就好,不解释什么是git什么事github,git有什么优势. 1,先创建一个android应用, 第二步:创建github账户 和 安装git.网上的文章多如牛毛.唯一要说的 ...

  5. 使用pycharm开发代码上传到GitLab和GitHub

    使用pycharm开发代码上传到GitLab和GitHub 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我这里主要是针对局域网的自减的GitLab服务器,python开发工程师如 ...

  6. Android studio下将项目代码上传至github包括更新,同步,创建依赖

    AS中设置GIT 一.开篇 本文讲如何使用Android Studio将项目上传到github,虽然讲上传github的文章很多,但是大部分都是使用Git Bash命令行,虽然效率高些,但是有点麻烦, ...

  7. mac上将代码上传到github

    前言 有时我们会写一些小程序来学习新的知识,但是完事之后过一段时间可能会忘记,最好的办法就是找到原来的代码看一看.现在可以将代码免费托管到一些网站上,其中最著名的非github莫属了, 今天就把这个过 ...

  8. 使用git工具将本地电脑上的代码上传至GitHub

    本文教你如果使用git工具将本地电脑上的代码上传至GitHub 1.安装git工具 安装git链接 2.使用git工具上传自己的代码到GitHub中 安装完git工具之后,我们会得到两个命令行工具,一 ...

  9. mac上将代码上传到github以及github对100M以上文件限制上传的处理(lfs)。

    前言 有时我们会写一些小程序来学习新的知识,但是完事之后过一段时间可能会忘记,最好的办法就是找到原来的代码看一看.现在可以将代码免费托管到一些网站上,其中最著名的非github莫属了, 今天就把这个过 ...

随机推荐

  1. HTML+CSS布局技巧及兼容问题【阅读季】

    在IE6和IE7中,行高值必须大于字体的2px以上才能保证字体的完整显示或当作为链接时能显示下划线. IE6 下去掉 input等元素 的边框 border: 0 none; 所有浏览器都可以了 边框 ...

  2. Java与各种数据库连接代码

    6.MySQL数据库Class.forName("org.gjt.mm.mysql.Driver").newInstance();String url ="jdbc:my ...

  3. DataTable to Excel(使用NPOI、EPPlus将数据表中的数据读取到excel格式内存中)

    /// <summary> /// DataTable to Excel(将数据表中的数据读取到excel格式内存中) /// </summary> /// <param ...

  4. 理解 Delphi 的类(八) - 关于类的定义

      //标准语法   TMyClass1 = class(TObject)   end;   //如果是继承自 TObject 可以省略   TMyClass2 = class   end;   // ...

  5. Android插件化框架研究-DroidPlugin

    直接贴上我做的ppt.

  6. Oracle的SQL语句中的变量替换

    一.问题描述 如下SQL: INSERT INTO tmp(val)VALUES('a&b'); 执行过程中会出现如下提示: 点击"确定"过后我们查看表中的数据: b后面的 ...

  7. Go简介

    Go是Google开发的一种编译型,並發型,并具有垃圾回收功能的编程语言. 罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pike)及肯·汤普逊于2007年9月开始设计Go ...

  8. Hamming Distance

    The Hamming distance between two integers is the number of positions at which the corresponding bits ...

  9. Android issues

    1. Android studio 2.0 Error:Exception in thread "main" java.lang.UnsupportedClassVersionEr ...

  10. Java中的堆栈区别

    在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配 ...