数据结构课程设计.docx
《数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构课程设计
课题名称
一.计算器模拟
问题描述
对包含加、减、乘、除、括号运算符的任意整型表达式进行求解
设计思路
这个程序的关键点是利用栈结构将输入的中缀表达式转化成后缀表达式,同时计算后缀表达式结果并输出,在这一过程中需要将连续的几个操作数化成一个操作数并入栈
数据结构定义
#defineMAXSIZE100
typedefstructnode/*顺序栈*/
{
intdata[MAXSIZE];
inttop;
}SeqStack,*PSeqStack;
功能函数设计
1.判断是否为操作数IsNum(charc)
在入栈前判断字符是否为操作数
2.定义每个算术符的优先级priority(charop)
定义运算符的优先级
3.中缀转后缀infix_exp_value(char*infixexp,char*postfixexp)
将用户输入的中缀表达式转化成后缀表达式,以方便后续的计算,其中利用
4.计算后缀postfix_exp(char*A)
5.主函数main()
编码实现
intIsNum(charc)//判断是否为操作数
{
if(c>='0'&&c<='9')
return
(1);
else
return(0);
}
intpriority(charop)//定义每个算术符的优先级
{
switch(op)
{
case'#':
return
(1);
case')':
return
(2);
case'+':
case'-':
return(3);
case'*':
case'/':
return(4);
case'(':
return(5);
default:
return(0);
}
}
intinfix_exp_value(char*infixexp,char*postfixexp)//中缀转后缀
{
PSeqStackS;
charc,w,topelement;
intf=1;
S=Init_SeqStack();
if(!
S)
{
printf("栈初始化失败\n");
return(0);
}
Push_SeqStack(S,'#');
w=*infixexp;
while((GetTop_SeqStack(S,&c),c)!
='#'||w!
='#')
{
if(IsNum(w))
{
if(f==0)
{
*postfixexp=w;
postfixexp++;
w=*(++infixexp);
}
else
{
*postfixexp='a';
postfixexp++;
*postfixexp=w;
postfixexp++;
w=*(++infixexp);
f=0;
}
}
else
{
f=1;
if((GetTop_SeqStack(S,&c),c)=='('&&w==')')
{
Pop_SeqStack(S,&topelement);
w=*(++infixexp);
}
else
if((GetTop_SeqStack(S,&c),c)=='('||priority((GetTop_SeqStack(S,&c),c)){
Push_SeqStack(S,w);
w=*(++infixexp);
}
else
{
Pop_SeqStack(S,&topelement);
*postfixexp=topelement;
postfixexp++;
}
}
}
*postfixexp='#';
*(++postfixexp)='\0';/*添加字符串结束符号*/
Destroy_SeqStack(&S);/*销毁栈*/
return
(1);
}
doublepostfix_exp(char*A)//计算后缀
{
PSeqStackS;
intResult,a,b,c,d,f;
charch;
f=1;
ch=*A++;
S=Init_SeqStack();
while(ch!
='#')
{
if(IsNum(ch))
if(f==0)
{
Pop_SeqStack(S,&d);
d=d*10;
d=d+ch-'0';
Push_SeqStack(S,d);
}
else
{
Push_SeqStack(S,ch-'0');
f=0;
}
else
{
f=1;
if(ch!
='a')
{
Pop_SeqStack(S,&b);
Pop_SeqStack(S,&a);
switch(ch)
{
case'+':
c=a+b;/*printf("%d\n",c);*/break;
case'-':
c=a-b;break;
case'/':
c=a/b;break;
case'*':
c=a*b;break;
case'%':
c=(int)a%(int)b;break;
}
Push_SeqStack(S,c);
}
}
ch=*A++;
}
GetTop_SeqStack(S,&Result);
Destroy_SeqStack(&S);
returnResult;
}
voidHY()
{
printf("****************************************\n");
printf("**\n");
printf("**\n");
printf("*欢迎使用计算器模拟器*\n");
printf("**\n");
printf("**\n");
printf("****************************************\n");
}
intmain()//main函数
{
charin[100],post[100],a;
ints;
while
(1)
{
HY();
printf("请输入表达式并以#为结束字符\n");
scanf("%s",in);
infix_exp_value(in,post);
s=postfix_exp(post);
printf("计算结果为%d\n",s);
printf("继续计算y/n\n");
getchar();
scanf("%c",&a);
printf("%c\n",a);
if(a=='n')
break;
system("cls");
}
}
运行与测试
1加
2减
3乘
4除
5综合
二.学生成绩查询系统
问题描述
试编写程序完成学生成绩记录的查询。
学号
姓名
成绩
99070101
李军
98.6
99070102
王颜霞
86
99070103
孙涛
56
99070104
单晓宏
96
99070105
张华
83
99070106
李小明
72
99070107
陈晓婷
98
若按学号进行顺序查找,例如:
输入99070101,则输出98.6;
按学号排序后进行折半查找;
随机输入以学号为关键字的学生信息并建构二叉排序树,对学号进行二叉排序树查找。
程序框架
设计思路
学生信息包括学号、姓名、分数,所以新建一个结构体Student
顺序查找只需建一个结构体数组,以学号为关键字进行查找;
折半查找要保证数组是按学号进行排序过的,然后在数据中间进行查找,若目标学号小于中间值,则对前半部分重复上述操作,反之,则对后半部分进行重复操作;
二叉树查找,需在文件中插入标志数据,然后将文件中的数据输入二叉树中,标志数据处,输入空值,然后对二叉树进行先序遍历查找。
编码实现
#include"stdio.h"
#include"stdlib.h"
#include"math.h"
#defineMaxSize30
into=0;
intu=0;
intsign=-1;
intsign_tree;
typedefstructnode{
intnum;
charname[MaxSize];
floatscore;
}Student;
typedefstructbnode{
Studentdata;
structbnode*Lchild,*Rchild;
}Bnode,*BTree;
typedefstructsnode{
BTreepor[MaxSize];
inttop;
}SeqStack,*PSeqStack;
intInput(Studentc[])//从文件导入
{
inti=0;
FILE*fp;
fp=fopen("XX.txt","r");
while(c[i-1].num!
=0)
{
fscanf(fp,"%d%s%f",&c[i].num,c[i].name,&c[i].score);
i++;
}
returni;
}
intInput_tree(Studentc[])//从文件导入
{
inti=0;
FILE*fp;
fp=fopen("ll.txt","r");
while(c[i-1].num!
=0)
{
fscanf(fp,"%d%s%f",&c[i].num,c[i].name,&c[i].score);
i++;
}
returni;
}
voidSeq_search(Studentc[],intlength,intgoal)//按学号进行顺序查找
{
inti;
for(i=0;i{
if(c[i].num==goal)
{
printf("顺序查找结果为:
%d%s%.2f\n",c[i].num,c[i].name,c[i].score);
break;
}
}
o=i+1;
if(i=length&&c[i].num!
=goal)
printf("查无结果!
\n");
}
voidPaixu_num(Studentc[],intlength)
{
inti,j;
Studentp;
for(i=0;ifor(j=0;j{
if(c[j].num>c[j+1].num)
{
p=c[j];
c[j]=c[j+1];
c[j+1]=p;
}
}
}
voidHalf_search(Studentc[],intlow,inthigh,intgoal)//按学号进行折半查找
{
o++;
if((goalc[high].num)&&o==1)
printf("查无结果!
\n");
else
{
intmid=(low+high)/2;
if(goalHalf_search(c,low,mid-1,goal);
elseif(goal>c[mid].num)
Half_search(c,mid+1,high,goal);
else
printf("折半查找结果为:
%d%s%.2f\n",c[mid].num,c[mid].name,c[mid].score);
}
}
PSeqStackInit_SeqStack(void)
{
PSeqStackS;
S=(PSeqStack)malloc(sizeof(SeqStack));
if(S)
S->top=-1;
returnS;
}
intEmpty_SeqStack(PSeqStackS)
{
if(S->top==-1)
return1;
else
return0;
}
voidPush_SeqStack(PSeqStackS,BTreex)
{
if(S->top==MaxSize-1)
printf("栈满不能进栈!
\n");
else
{
S->top++;
S->por[S->top]=x;
}
}
voidPop_SeqStack(PSeqStackS,BTree*x)
{
if(Empty_SeqStack(S))
printf("栈空不能出栈!
");
else
{
*x=S->por[S->top];
S->top--;
}
}
Student*Data;
StudentTianjia(inti)
{
Studentt;
t=Data[i];
returnt;
}
BTreeCreat_Tree()
{
BTreet;
Studentd;
d=Tianjia(++sign);
if(d.num==1)
t=NULL;
else
{
t=(Bnode*)malloc(sizeof(Bnode));
t->data=d;
t->Lchild=Creat_Tree();
t->Rchild=Creat_Tree();
}
returnt;
}
voidSearch_SeqStack(BTreet,intgoal)
{
PSeqStackS;
BTreep=t;
S=Init_SeqStack();
while(p||!
Empty_SeqStack(S))
{
o++;
if(p)
{
if(p->data.num==goal)
{
printf("二叉树查找结果为:
%d%s%.2f\n",p->data.num,p->data.name,p->data.score);
sign_tree=1;
break;
}
Push_SeqStack(S,p);
p=p->Lchild;
}
else
{
Pop_SeqStack(S,&p);
p=p->Rchild;
}
}
if(sign_tree==0)
printf("查无结果!
\n");
}
voidmain()
{
intlength,goal,length_tree;
Studentc[MaxSize];
Studentg[MaxSize];
BTreet;
length=Input(c)-1;
length_tree=Input_tree(g)-1;
Data=g;
t=Creat_Tree();
while(goal!
=0)
{
printf("请输入要查找目标的学号:
");
scanf("%d",&goal);
Seq_search(c,length,goal);
printf("顺序查找次数为:
%d\n",o);
o=0;
printf("\n");
Paixu_num(c,length);
Half_search(c,0,length,goal);
printf("折半查找次数为:
%d\n",o);
o=0;
printf("\n");
Search_SeqStack(t,goal);
printf("二叉树查找次数为:
%d\n",o);
printf("\n");
}
}
运行与测试
输入目标学号,程序分别进行三种形式的查询,并输出查询目标的学号、姓名、成绩等信息,当目标学号为0时,查询结束。