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;}}



原创粉丝点击