java利用链栈实现大数加法问题
来源:互联网 发布:软件项目团队介绍 编辑:程序博客网 时间:2024/06/05 07:03
【问题分析】
1、将两个加数的相应位从高位到低位依次压如栈sa,sb
2、若两个加数栈都非空,则依次从栈中弹出栈顶数字相加,结果存入partialsum;
若和有进位,则将和的个位数压入结果栈sum中,并将进位数1加到下一位数字相加的和中;
若和没有进位,则直接将和存入栈sum中
3、若某个加数堆栈为空,则将非空栈中的站顶数字依次弹出与进位数相加,和的个位数压入sum,直到该栈为空为止。
若最高位有进位,则最后将1压入sum
4、若两个加数栈都为空,则栈sum中保存的就是计算结果。栈顶是结果中最高位数字。
链栈中的结点类就是前面文章的Node类,不再重复
下面是实现栈的抽象数据类型用java接口描述
public interface Istack {public void clear();public boolean isEmpty();public int length();public Object peek();public void push(Object x);public Object pop();}下面是实现接口Istack的链栈类的描述
public class Linkstack implements Istack{public Node top; //栈顶元素引用public void clear(){ //将栈置空top=null;}public boolean isEmpty(){ //判断链栈是否为空return top==null;}public int length(){ //求链栈的长度 int length=0;Node p=top;while(p!=null){p=p.getnext();length++;}return length;}public Object peek(){ //取栈顶元素并返回其值if(isEmpty())return null;elsereturn top.getdata();}public void push(Object x){ //入栈Node p=new Node(x);p.setnext(top);top=p;}public Object pop(){ //出栈 if(isEmpty()) return null; else{ Node p=top; top=top.getnext(); return p.getdata(); }}}
java利用链栈实现大数加法
public class example {public static void main(String[] args)throws Exception{example e=new example();System.out.println("两个数的和"+add("19327","91323"));}public static String add(String str1,String str2)throws Exception{Linkstack sum=new Linkstack(); //大数的和Linkstack sa=new Linkstack();Linkstack sb=new Linkstack();for(int i=0;i<str1.length();i++)sa.push(Integer.valueOf(String.valueOf(str1.charAt(i)))); //数字放入栈中for(int i=0;i<str2.length();i++)sb.push(Integer.valueOf(String.valueOf(str2.charAt(i)))); //数字放入栈中int partialsum=0;boolean iscarry=false; //进位标识while(!sa.isEmpty()&&!sb.isEmpty()){ //加数和被加数栈同时非空partialsum=(Integer)sa.pop()+(Integer)sb.pop(); //对于两个位求和if(iscarry){ //需要进位partialsum++; //进的位加到此位上iscarry=false; //重置进位标识}if(partialsum>=10){ //判断是否需要进位partialsum-=10;sum.push(partialsum);iscarry=true; //标识进位}elsesum.push(partialsum); //不需要进位}Linkstack temp=!sa.isEmpty()?sa:sb;while(!temp.isEmpty()){ if(iscarry){ //最后一次执行加法运算中需要进位int t=(Integer)temp.pop(); //取出sa或sb中没有进行运算的数t++;if(t>=10){ //判断是否需要进位t-=10;sum.push(t);}else{sum.push(t);iscarry=false;}}else //最后一次执行加法运算中不需要进位sum.push(temp.pop());}if(iscarry) //最高位需要进位sum.push(1); //进位放入栈中String str=new String();while(!sum.isEmpty()){str=str.concat(sum.pop().toString());}return str;}}
阅读全文
0 0
- java利用链栈实现大数加法问题
- Java链栈实现两个大数加法
- JAVA实现大数加法
- JAVA实现大数加法
- java实现大数加法
- Java实现大数加法运算
- 大数乘法与大数加法 java实现
- 用栈实现大数加法
- 链表实现大数加法
- 大数运算之加法乘法---JAVA实现
- 1005 大数加法(java写大数问题真有优势)
- 大数乘法、大数加法实现
- 栈的应用-大数加法问题
- 大数加法.重载实现
- 大数加法的实现
- char *实现大数加法
- string实现大数加法
- 1002 Java大数加法
- 總結——關於2017 10 17測試的分析總結
- Oracle数据库入门知识点总结
- python核心编程系列-1
- 【编程之美】读书笔记:寻找最大的K个数
- JS截取字符串常用方法详细整理
- java利用链栈实现大数加法问题
- 【1017】数列
- BZOJ1070 / SCOI2007 修车【网络流/费用流】
- hdu 2883 kebab (最大流 + 建图)
- 改变边框线条与背景重叠的布局
- Hero鹏——只为挖坑而生
- Github使用教程
- 设计模式--观察者模式
- 操作符