计算机基础算法实验.docx
《计算机基础算法实验.docx》由会员分享,可在线阅读,更多相关《计算机基础算法实验.docx(12页珍藏版)》请在冰豆网上搜索。
![计算机基础算法实验.docx](https://file1.bdocx.com/fileroot1/2023-1/23/621bc5cb-cd5e-40b2-a787-e5cb41960b11/621bc5cb-cd5e-40b2-a787-e5cb41960b111.gif)
计算机基础算法实验
计算机基础算法实验
班级:
学号:
姓名:
完成日期:
算法1实现两个整数相加
1.需求分析
课程设计任务是用链表(单链表或双向链表)实现任意位数的整数相加。
输入的形式和输入值的范围:
长度不超过一百位的整数。
输出的形式:
有中文提示,分三行输出。
2.概要设计
LNode*CreatList()操作结果:
构造一个链表.
LNodeAdd(LNode*t1,LNode*t2)初始条件:
存在两个结点t1,t2;操作结果:
实现两个结点的相加。
voidprint(LNode*L)初始条件:
L存在;操作结果:
打印链表L。
3.详细设计
(1)
主过程
(2)
打印求和链表过程
4.调试分析
输入的数必须为长度不超过一百位的整数,否则出现错误;如:
输入6.4和3.2,输出结果为9-46。
根据实际情况的需要,可以将整数的长度定义为1000位,甚至更长。
5.总结
(1)熟悉掌握链表的建立及调用,同时对数组的理解进一步加深;
(2)认识到自己的不足,以后多加练习,争取写出更好的算法。
实验内容:
源程序:
#include
#include
#include
#defineMAX100
typedefstructLNode
{
intdata;
structLNode*pre,*next;
}LNode,List;
LNode*CreatList()
{
LNode*p,*q,*r;
chars[MAX];
inti=0;
printf("输入一个整数:
");
gets(s);
p=(LNode*)malloc(sizeof(List)*MAX);
q=r=p;
p->data=-1;
while(s[i]!
=NULL)
{
q=(LNode*)malloc(sizeof(List));
q->data=s[i++]-'0';
q->pre=r;
r->next=q;
r=q;
}
r->next=NULL;
returnp;
}
LNodeAdd(LNode*t1,LNode*t2)
{
while(t1->data!
=-1&&t2->data!
=-1)
{
t1->data=t1->data+t2->data;
if(t1->data>9)
{
t1->data-=10;
t1->pre->data+=1;
}
t1=t1->pre;
t2=t2->pre;
}
if(t1->next->data>9)
t1->next->data-=10;
return*t1;
}
LNode*Compare(LNode*p1,LNode*p2)
{
LNode*s1=p1->next,*s2=p2->next,*t1,*t2;
inti=0,j=0;
while(s1!
=NULL)
{t1=s1;s1=s1->next;i++;}
while(s2!
=NULL)
{t2=s2;s2=s2->next;j++;}
if(i>=j)Add(t1,t2);
elseAdd(t2,t1);
returni>=j?
p1:
p2;
}
voidprint(LNode*L)
{
LNode*p;
printf("两整数的和为:
");
if(L->data!
=-1)printf("%d",1);
p=L->next;
do
{
printf("%d",p->data);
p=p->next;
}
while(p!
=NULL);
printf("\n");
}
intmain()
{
LNode*p1,*p2,*p3;
p1=CreatList();
p2=CreatList();
p3=Compare(p1,p2);
print(p3);
getch();
return0;
}
运行结果:
示例
输入一个整数:
6541
输入一个整数:
212354
两整数的和为:
218895
运行效果图为:
算法2算术表达式求值
1.需求分析
课程设计任务是以字符序列的形式从终端输入语法正确的、不含变量的整数表达式,利用给定的算符优先关系,实现对算术四则混合运算表达式的求值,并演示在求值过程中运算符栈、操作数栈、操作数栈和主要操作的变化过程。
输入的形式和输入值的范围:
不含变量的整数表达式,算术四则混合运算表达式。
输出的形式:
表达式。
2.概要设计
StatusInitStack(SqStack&S)操作结果:
构造一个空栈S。
StatusGetTop(SqStackS)初始条件:
栈S存在且非空。
操作结果:
用e返回S的栈顶元素.
StatusPush(SqStack&S,ElemTypee)初始条件:
栈S已存在。
操作结果:
插入元素e为新的栈顶元素.
StatusPop(SqStack&S,ElemType&e)初始条件:
栈S存在且非空.操作结果:
删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR.
3.详细设计
4.调试分析
设计算法时,应考虑到运算符的优先关系,依此思想进行设计;该算法的时间复杂度为O(n),n为栈的长度;
5.总结
(1)通过该算法了解到自己对栈的理解不是很到位,因此以后要加强这方面的练习,遇到类似问题时,不会束手无策;
(2)该算法是参考资料加上自己的理解所得,学到了不少的东西,收获也不小。
实验内容:
源程序:
#include
#include
#include
#include
#defineOVERFLOW-1
#defineOK0
#defineERROR1
typedefintStatus;
#defineSTACK_INIT_SIZE100//初始分配量
#defineSTACKINCREMENT10//存储空间的分配增量
typedefcharElemType;
typedefElemTypeOperandType;//操作数
typedefcharOperatorType;
typedefstruct
{
ElemType*base;
ElemType*top;
intstacksize;
}SqStack;
StatusInitStack(SqStack&S)
{
//构造一个空栈S
S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!
S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnOK;
}
StatusGetTop(SqStackS){
ElemTypee;
if(S.top==S.base)returnERROR;
e=*(S.top-1);
returne;
}
StatusPush(SqStack&S,ElemTypee)
{
//插入元素e为新的栈顶元素
if(S.top-S.base>=S.stacksize){
S.base=(ElemType*)realloc(S.base,
(S.stacksize+STACKINCREMENT)*sizeof(ElemType));
if(!
S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
returnOK;
}
StatusPop(SqStack&S,ElemType&e){
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
if(S.top==S.base)returnERROR;
e=*--S.top;
returnOK;
}
charIn(charc,charOP[])
{
if(c>=35&&c<=47)
return1;
elsereturn0;
}
charOP[8]={'+','-','*','/','(',')','#','\0'};
intm[7][7]=
{1,1,2,2,2,1,1,
1,1,2,2,2,1,1,
1,1,1,1,2,1,1,
1,1,1,1,2,1,1,
2,2,2,2,2,0,-1,
1,1,1,1,-1,1,1,
2,2,2,2,2,-1,0};
charPrecede(chari,charj)
{
inta,b;char*p;
for(p=OP,a=0;*p!
='\0';p++,a++)
if(*p==i)break;
for(p=OP,b=0;*p!
='\0';p++,b++)
if(*p==j)break;
if(m[a][b]==1)return'>';
elseif(m[a][b]==2)return'<';
elseif(m[a][b]==0)return'=';
elsereturn'O';
}
charOperate(chara,chartheta,charb)
{
if(a>47)a=atoi(&a);
if(b>47)b=atoi(&b);
switch(theta)
{
case'+':
returna+b;
break;
case'-':
returna-b;
break;
case'*':
returna*b;
break;
case'/':
returna/b;
break;
}
}
OperandTypeEvaluateExpression()
{
SqStackOPTR,OPND;
OperandTypea,b,c;OperatorTypetheta;
InitStack(OPTR);Push(OPTR,'#');
InitStack(OPND);c=getchar();
while(c!
='#'||GetTop(OPTR)!
='#')
{
if(!
In(c,OP)){Push(OPND,c);c=getchar();}
else
switch(Precede(GetTop(OPTR),c))
{
case'<':
Push(OPTR,c);c=getchar();
break;
case'=':
Pop(OPTR,c);c=getchar();
break;
case'>':
Pop(OPTR,theta);
Pop(OPND,b);Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;
}
}
returnGetTop(OPND);
}
voidmain()
{
printf("(以#为结束符)\n");
printf("请输入:
\n");
inta;
a=(int)EvaluateExpression();
printf("%d",a);
getch();
}
运行结果:
示例
(以#为结束符)
请输入:
4*(2+3)-4#
16
运行效果图为: