数据结构(java语言描述)顺序栈的使用(两个大数相加)

利用http://www.cnblogs.com/xleer/p/5289661.html中对顺序栈以及栈的进本方法的定义,实现超过整数上限的两个数的加法计算。

算法:

package stack;
/**********************************************************************
 * @author sch
 ********利用栈,计算两个大数的和。大数的值超过int存储的范围*******************
********************************************************************* */
import java.util.Scanner;
import java.math.*;
public class Sumdata {
    public String add(String a,String b)throws Exception{
        int l1=a.length();
        int l2=b.length();
        int l3=0;
        if(l1>l2)
            l3=l1+1;
        else
            l3=l2+1;
        sqstack sum=new sqstack(l3);
        sqstack sa=numsplit(a);//将家数以字符的形式入栈
        sqstack sb=numsplit(b);
        int partialsum;
        boolean iscarry=false;
        while(!sa.isEmpty()&&!sb.isEmpty())
        {//加数和非加数同时非空则入栈
                partialsum=(Integer)sa.pop()+(Integer)sb.pop();//计算栈顶元素之和
                if(iscarry)
                {
                        partialsum++;
                        iscarry=false;
                }//先判断是否进位,并对partialsum做处理
                if(partialsum>=10)
                {//分情况对partialsum做进栈处理
                        partialsum-=10;
                        sum.push(partialsum);
                        iscarry=true;
                }
                else
                {
                    sum.push(partialsum);
                }
        }
        sqstack temp=!sa.isEmpty()?sa:sb;//引用指向加数和被加数中非空栈
        while(!temp.isEmpty())
        {//分情况,如若两个栈中只有一个非空
            if(iscarry)
            {//若果此时仍存在进位
                    int t=(Integer)temp.pop();
                    ++t;
                    if(t>=10)
                    {
                            t-=10;
                            sum.push(t);
                            //iscarry=true;
                    }else
                    {
                    sum.push(t);
                    iscarry=false;//此时不存在进位,将进位置为0
                    }
            }else//此时iscarry为false,不需要进位,进行while的下一轮判断
                sum.push(temp.pop());//最后依次执行加法时不需要进位,把加数或被加数的值放入和的栈中
        }//while的判断
        if(iscarry){//最高位,即两个栈都为空后,的进位进sum栈
            sum.push(1);
        }
        String str=new String();
        while(!sum.isEmpty())//将asum栈中的值全部抛出转换为string
            str=str.concat(sum.pop().toString());
        return str;
    }//至此,做和的算法完毕
    public sqstack numsplit(String str)throws Exception{//对输入的字符做入栈操作
        sqstack s=new sqstack(str.length());
        for(int i=0;i<str.length();i++){
            char c=str.charAt(i);
            if(' '==c)
                continue;
            else if('0'<=c&&'9'>=c){
                s.push(Integer.valueOf(String.valueOf(c)));
            }else
                throw new Exception("错误:输入了非数字型的字符!");
        }
        return s;
    }
   public static void main(String[] args)throws Exception{
       Scanner sc=new Scanner(System.in);
       System.out.println("请输入您要计算的两个整数:");
       String  a=sc.next();
       String b=sc.next();
       Sumdata e=new Sumdata();
       String sum=e.add(a, b);
       System.out.println("两个大数的和为:"+sum);
       
   }
}

posted on 2016-03-18 20:20  XLeer  阅读(533)  评论(0编辑  收藏  举报

导航