大数相加–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;
}
代码不难,只是没加输入挑选工作,所以只能输入纯数字。
(完)