栈和队列的应用.docx
- 文档编号:4970368
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:21
- 大小:285.41KB
栈和队列的应用.docx
《栈和队列的应用.docx》由会员分享,可在线阅读,更多相关《栈和队列的应用.docx(21页珍藏版)》请在冰豆网上搜索。
栈和队列的应用
实验报告
课程名称数据结构
实验项目栈和队列的应用
实验仪器计算机
系别计算机学院学院
专业计算机科学与技术
学生姓名徐申毅
实验日期2013-4-10
成绩
指导教师
实验2
一 、实验目的
(1)理解栈和队列的数据结构
(2)会利用栈编制程序
2、 实验内容
(1)编写链式栈实现入栈,出栈,获取栈顶元素等基本操作
(2)编写循环队列实现元素增添与删除等基本操作
(3)用栈的数据结构实现输入表达式求值的计算器
三、实验课时
4课时
四、实验步骤
(1)链式栈
声明出栈,入栈等基本操作的函数
定义出栈,入栈等基本操作的函数
定义主函数,在主函数中调用上述函数
编译,运行
(2)循环队列
定义结构体类型,头指针和尾指针
声明并定义入队,出队等基本操作函数
定义主函数,在主函数中调用基本操作函数
编译,运行
(3)计算器
定义两个栈,一个用于存放数字,一个用于存放操作符
声明并定义操作符优先级比较函数
定义主函数,实现加减乘除的运算方法
调用操作符优先级比较函数
编译,运行
5、实验心得
本次实验让我了解了栈和队列两种数据结构,栈的特点是后进先出,队列的特点是先进先出,我还学会了利用栈后进先出的数据结构特点完成表达式计算器的应用。
6、程序运行结果截图以及C程序源代码
(1)链式栈
#include
#defineSIZEsizeof(LINKSTACK)
#definePRINT_ITEM"%d"//定义输出项的宏
#defineSCANF_ITEM"%d"//定义输入项的宏
typedefintbool;//定义bool类型
constbooltrue=1;//定义bool类型true常量
constboolfalse=0;//定义bool类型false常量
typedefintELEMTYPE;//定义元素类型
typedefstructsnode//定义链栈
{
ELEMTYPEdata;
structsnode*next;
}LINKSTACK;
constELEMTYPESTACK_NULL=-9999;//定义常量栈为NULL的值
LINKSTACK*INITSTACK();//初始化栈
LINKSTACK*CREATESTACK(ELEMTYPE);//创建链栈
LINKSTACK*PUSH(LINKSTACK*,ELEMTYPE);//进栈操作
ELEMTYPEGETTOP(LINKSTACK*);//获取栈顶元素
LINKSTACK*POP(LINKSTACK*);//出栈操作
boolEMPTY(LINKSTACK*);//判断栈是否为NULL
LINKSTACK*CLEAR(LINKSTACK*);//清空链栈
intCURRENT_SIZE(LINKSTACK*);//当前链栈中的元素个数
voidPRINT_STACK(LINKSTACK*);//打印链栈元素
voidmenu();//菜单
voidprint_enter();//打印回车
voidprint_tab();//打印tab
voidprint_menu_item(char*,char*);//打印菜单中的每一项
voidprint_str(char*);
voidprint_info(char*,bool);//打印信息,bool意思是是否打印回车
ELEMTYPEget_input();//获取压栈的数据
LINKSTACK*stack_push(LINKSTACK*);//压入链栈
LINKSTACK*stack_pop(LINKSTACK*);//出栈
LINKSTACK*stack_get_top(LINKSTACK*);//获取栈顶元素
LINKSTACK*stack_empty(LINKSTACK*);//判断栈是否为空
LINKSTACK*stack_cur_size(LINKSTACK*);//获取栈中的元素个数
LINKSTACK*stack_clear(LINKSTACK*);//清空栈中元素
LINKSTACK*link_stack_method(LINKSTACK*,LINKSTACK*(*fun)(LINKSTACK*));//定义函数指针
intmain(intargc,char*argv[])
{
LINKSTACK*top=NULL;
intselect_menu_value;
menu();
do
{
print_info("请选择:
",false);
scanf("%d",&select_menu_value);
switch(select_menu_value)
{
case0:
menu();
break;
case7:
break;
case1:
top=link_stack_method(top,stack_push);
break;
case2:
top=link_stack_method(top,stack_pop);
break;
case3:
top=link_stack_method(top,stack_get_top);
break;
case4:
top=link_stack_method(top,stack_empty);
break;
case5:
top=link_stack_method(top,stack_cur_size);
break;
case6:
top=link_stack_method(top,stack_clear);
break;
default:
menu();
break;
}
}while(7!
=select_menu_value);
return0;
}
LINKSTACK*INITSTACK()
{
LINKSTACK*stack=malloc(SIZE);
returnstack;
}
LINKSTACK*CREATESTACK(ELEMTYPEdata)
{
LINKSTACK*head=INITSTACK();
head->data=data;
returnhead;
}
LINKSTACK*PUSH(LINKSTACK*top,ELEMTYPEdata)
{
LINKSTACK*p=CREATESTACK(data);
if(NULL==top)//当栈为NULL,则将当前的数据存放在栈底
{
p->next=NULL;
}
else
{
p->next=top;
}
top=p;
returntop;
}
ELEMTYPEGETTOP(LINKSTACK*top)
{
ELEMTYPEresult=STACK_NULL;
if(top!
=NULL)
{
result=top->data;
}
returnresult;
}
LINKSTACK*POP(LINKSTACK*top)
{
LINKSTACK*del;
if(!
EMPTY(top))
{
del=top;
top=top->next;
free(del);//释放内存
}
returntop;
}
boolEMPTY(LINKSTACK*top)
{
boolresult=false;
if(top==NULL)
{
result=true;
}
returnresult;
}
LINKSTACK*CLEAR(LINKSTACK*top)
{
LINKSTACK*del;
if(!
EMPTY(top))
{
del=top;
top=top->next;
free(del);
top=CLEAR(top);//使用递归进行将栈置空操作
}
returntop;
}
intCURRENT_SIZE(LINKSTACK*top)
{
intresult=0;
while(top!
=NULL)
{
result++;
top=top->next;
}
returnresult;
}
voidPRINT_STACK(LINKSTACK*top)
{
while(top!
=NULL)
{
printf(PRINT_ITEM,top->data);
top=top->next;
}
}
voidmenu()
{
print_enter();
print_tab();print_info("链栈",true);print_enter();
print_menu_item("1","入栈操作");
print_menu_item("2","出栈操作");
print_menu_item("3","获取栈顶元素");
print_menu_item("4","判断栈表是否为空");
print_menu_item("5","栈中元素个数");
print_menu_item("6","清空栈表");
print_menu_item("0","返回到选择菜单");
print_menu_item("7","退出程序");
}
voidprint_enter()
{
printf("\n");
}
voidprint_tab()
{
printf("\t");
}
voidprint_menu_item(char*item,char*desc)
{
print_tab();
print_str(item);
print_tab();
print_str(desc);
print_enter();
}
voidprint_str(char*str)
{
while(*str)
{
printf("%c",*str++);
}
}
voidprint_info(char*str,boolenter)
{
print_tab();
print_str(str);
if(enter)
{
print_enter();
}
}
ELEMTYPEget_input()
{
ELEMTYPEresult;
print_info("向栈中放入一个元素:
",false);
scanf(SCANF_ITEM,&result);
returnresult;
}
LINKSTACK*stack_push(LINKSTACK*top)
{
ELEMTYPEdata=get_input();
top=PUSH(top,data);
print_info("添加成功!
",true);
returntop;
}
LINKSTACK*stack_pop(LINKSTACK*top)
{
top=POP(top);
print_info("删除元素.",true);
returntop;
}
LINKSTACK*stack_get_top(LINKSTACK*top)
{
ELEMTYPEresult=GETTOP(top);
print_tab();
if(result!
=STACK_NULL)
{
printf("栈顶元素为");
printf(PRINT_ITEM,result);
}
else
{
printf("error:
此栈是空栈.");
}
print_enter();
returntop;
}
LINKSTACK*stack_empty(LINKSTACK*top)
{
boolresult=EMPTY(top);
if(!
result)
{
print_info("此栈不为空.",true);
}
else
{
print_info("此栈是空栈.",true);
}
returntop;
}
LINKSTACK*stack_cur_size(LINKSTACK*top)
{
intresult=CURRENT_SIZE(top);
print_tab();
printf("栈中元素个数为%d",result);
print_enter();
returntop;
}
LINKSTACK*stack_clear(LINKSTACK*top)
{
top=CLEAR(top);
print_info("清空成功.",true);
returntop;
}
LINKSTACK*link_stack_method(LINKSTACK*top,LINKSTACK*(*fun)(LINKSTACK*src_top))
{
return(*fun)(top);
}
(2)循环队列
#include
usingnamespacestd;
#defineMAXQSIZE100
typedefstruct
{
int*base;
intfront;
intrear;
}SqQueue;
SqQueueQ;
voidInitQueue(SqQueue&Q)
{
Q.base=(int*)malloc(MAXQSIZE*sizeof(int));
if(!
Q.base)cout<<"初始化失败!
"< else{Q.front=Q.rear=0;cout<<"初始化成功! "< } voidPrintQueue(SqQueueQ) { while(Q.front! =Q.rear) { cout< Q.front=(Q.front+1)%MAXQSIZE; } cout< } intQueueLength(SqQueueQ) { return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE; } voidEnQueue(SqQueue&Q,inte) { if((Q.rear+1)%MAXQSIZE==Q.front)cout<<"操作失败! ! ! "< else { Q.base[Q.rear]=e; Q.rear=(Q.rear+1)%MAXQSIZE; } } voidDeQueue(SqQueue&Q,int&e) { if(Q.rear==Q.front)cout<<"操作失败! ! ! "< else { e=Q.base[Q.front]; Q.front=(Q.front+1)%MAXQSIZE; cout<<"删除后循环队列为: "; PrintQueue(Q); } } intQueueEmpty(SqQueueQ) { if(Q.front==Q.rear){cout<<"循环队列为空"< else{cout<<"循环队列不为空"< } intGetHead(SqQueueQ) { inte; if(Q.front==Q.rear)return0; else{e=Q.base[Q.front];returne;} } voidClearQueue(SqQueue&Q) { while(Q.rear! =Q.front)Q.front=(Q.front+1)%MAXQSIZE; } voidDestroyQueue(SqQueueQ) { free(Q.base); cout<<"循环队列已清除! ! ! "< } intmain() { cout<<"----**********循环队列程序**********----"< cout<<"0、队列的清除"< cout<<"1、队列初始化"< cout<<"2、队列的插入"< cout<<"3、输出队列"< cout<<"4、删除元素"< cout<<"5、判断是否为空"< cout<<"6、求队列的长度"< cout<<"7、返回队列的队头元素"< cout<<"8、退出程序"< SqQueueQ; intn,k; for(n=0;n<100;n++) { cout<<"请选择0-8: "; cin>>k; if(k==0){DestroyQueue(Q);n=100;} if(k==1)InitQueue(Q); if(k==3)PrintQueue(Q); if(k==2) { inte; cout<<"输入插入的元素: "; cin>>e; EnQueue(Q,e); cout<<"插入后队列为: "; PrintQueue(Q); } if(k==4) { intdel; DeQueue(Q,del); } if(k==5)QueueEmpty(Q); if(k==6)cout<<"队列的长度为: "< if(k==7)cout<<"队头元素为: "< if(k==8)break; } return0; } #include #include #include usingnamespacestd; #defineMAX1000 structsave1 {floatn[MAX]; inttop;}stack1; structsave2 {charn[MAX]; inttop;}stack2;//stack1存储数字,stack2存储运算符号. boolstackempty(save1s) {if(s.top==-1)return1; elsereturn0;} boolstackempty2(save2s) {if(s.top==-1)return1; elsereturn0;} voidpush(save1&s,floate)//将e入栈 {if(s.top==MAX-1) {cout<<"栈已满"< s.top++; s.n[s.top]=e;} voidpush2(save2&s,chare)//将e入栈 {if(s.top==MAX-1) {cout<<"栈已满"< s.top++; s.n[s.top]=e;} voidpop(save1&s,float&e)//将栈顶元素出栈,存到e中 {if(s.top==-1) {cout<<"栈为空"< else{e=s.n[s.top]; s.top--;}} voidpop2(save2&s,char&e)//将栈顶元素出栈,存到e中 {if(s.top==-1){cout<<"栈为空"< else{e=s.n[s.top];s.top--;}} intin(chare)//e在栈内的优先级别 {if(e=='-'||e=='+')return2; if(e=='*'||e=='/')return4; if(e=='^')return5; if(e=='(')return0; if(e==')')return7; return-1;} intout(chare)//e在栈外的优先级别 {if(e=='-'||e=='+')return1; if(e=='*'||e=='/')return3; if(e=='^')return6; if(e=='(')return7; if(e==')')return0; return-1;} voidcount (floata,charope,floatb)//进行计算并将计算结果入栈 {floatsum; if(ope=='+')sum=a+b; if(ope=='-')sum=a-b; if(ope=='*')sum=a*b; if(ope=='/')sum=a/b; if(ope=='^')sum=pow(a,b); push(stack1,sum);} intmain() {inti=0,len,j,nofpoint,g=0;//len表示输入式子的长度。 g表示读入的字符是否是字母变量、数字以及运算符。 floata,b;//a、b用来存储操作数栈中弹出的操作数,便于代入函数中进行计算。 charline[MAX],operate,temp[20]; cout<<"请输入表达式"< cin>>line; len=strlen(line); stack1.top=-1;//将栈置为空 stack2.top=-1;//将栈置为空 while (1){g=0; if(isdigit(line[i]))//若读入的字符为数字,则继续判断下一个字符,直到下一个字符不是数字或者不是小数点,即可保证该操作数是完整的小数,然后将该数入操作数栈。 {j=0;g=1;nofpoint=0;//记录所存
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 队列 应用
![提示](https://static.bdocx.com/images/bang_tan.gif)