大数相加 - C语言

大数相加–c语言链式栈表示。
代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct StackNode //链式栈结构体 
{
	char data;
	struct StackNode *next; 
}SqStack,*LinkStack;

void InitStack(LinkStack &S)//栈的初始化,只有创建一个栈顶结点这一步 
{
	S = (SqStack*)malloc(sizeof(SqStack));//创建一个野结点,使其为NULL,便成为栈顶结点。 
	S = NULL;
}

void Push(LinkStack &S,char e)//进栈 
{
	SqStack* p;//定义一个野结点 
	p = (SqStack*)malloc(sizeof(SqStack));
	p->data = e;//使该结点装上数据元素e,并使其next等于S,类似于链表的头插法 
	p->next = S;
	S = p;//栈顶结点S,一直在栈的最前方 
}

char Pop(LinkStack &S)//使栈顶元素出栈,并返回栈顶元素 
{
	char a,b = '0';
	if(S==NULL)//判断栈是否为空 
		return b;
	else
	{
		SqStack* p;//这里定义一个结点,方便后面对栈顶结点的释放 
		a = S->data;//栈顶数据赋值 
		p = S;
		S = S->next;//使栈顶结点指向下一个结点,类似于栈减一 
		p->next = NULL;
		free(p);//释放栈顶元素 
		return a;//返回栈顶原素 
	}	
}

void InputNumber(LinkStack &S,LinkStack &L)//数的输入 
{
	char a,b;
	printf("1请输入:");//第一个数据的输入 
	while(1)
	{
		scanf("%c",&a);
		if(a == '\n')//当检测到enter键时终止死循环 
			break;
		Push(S,a);//进栈 
	}
	printf("2请输入:");//第二个数据的输入 
	while(1)
	{
		scanf("%c",&b);
		if(b == '\n')
			break;
		Push(L,b);
	}
}

void Addition(LinkStack S,LinkStack L)//两数相加操作 
{
	LinkStack T;
	InitStack(T);//申请一个新栈,用于装两数相加的和 
	int m,n = 0;
	while(1)//两数相加,并导入栈T中 
	{
		n = (int)(Pop(S)) + (int)(Pop(L)) + n - 96;//int(2) == 50; 
		m = n%10+48;
		if(n/10)
			n = 1;
		else
			n = 0;
		Push(T,char(m));
		if(S == NULL && L == NULL)
			break;
	}	
	while(T != NULL)//利用循环打印T出栈的数据 
	{
		printf("%c",Pop(T));
	}
}

int main()
{
	LinkStack S,L;
	InitStack(S);//初始化两栈,来装加数和被加数 
	InitStack(L);
	InputNumber(S,L);//输入操作 
	Addition(S,L);//相加操作 
	return 0;
}

不过链式栈太浪费空间了,这里再用顺序栈来表示一下。
代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 10000 //静态顺序栈存储的最大空间 

typedef struct 
{
	char data[MAXSIZE];//静态顺序栈可用的最大容量 
	int top;//栈顶 
}SqStack;

void InitStack(SqStack &S)//栈的初始化 
{
	S.top = -1;//静态顺序栈中,使S.top=-1便是对栈的初始化 
}

int Push(SqStack &S,char e)//进栈 
{
	if(S.top==MAXSIZE-1)//判断栈是否为满 
	{
		printf("栈满!\n");
		return 0;
	}
	S.data[++S.top]=e;//S.top自加一,使S.top=0,使输入的e值导入栈中 
	return 0; 
}

char Pop(SqStack &S)//使栈顶元素出栈,并返回栈顶元素,且栈长减一 
{
	if(S.top == -1)
		return '0';
	return S.data[S.top--];
}

void InputNumber(SqStack &S,SqStack &L)//数的输入 
{
	char a,b;
	printf("1请输入:");//第一个数据的输入 
	while(1)
	{
		scanf("%c",&a);
		if(a == '\n')//当检测到enter键时终止死循环 
			break;
		Push(S,a);//进栈 
	}
	printf("2请输入:");//第二个数据的输入 
	while(1)
	{
		scanf("%c",&b);
		if(b == '\n')
			break;
		Push(L,b);
	}
}

void Addition(SqStack S,SqStack L)//两数相加操作 
{
	SqStack T;
	InitStack(T);//申请一个新栈,用于装两数相加的和 
	int m,n = 0;
	while(1)//两数相加,并导入栈T中 
	{
		n = (int)(Pop(S)) + (int)(Pop(L)) + n - 96;//int(2) == 50; 
		m = n%10+48;
		if(n/10)
			n = 1;
		else
			n = 0;
		Push(T,char(m));
		if(S.top == -1 && L.top == -1)
			break;
	}	
	while(T.top != -1)//利用循环打印T出栈的数据 
	{
		printf("%c",Pop(T));
	}
}

int main()
{
	SqStack S,L;
	InitStack(S);//初始化两栈,来装加数和被加数 
	InitStack(L);
	InputNumber(S,L);//输入操作 
	Addition(S,L);//相加操作 
	return 0;
}

代码不难,只是没加输入挑选工作,所以只能输入纯数字。
(完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值