数学与计算机科学系实验报告 课程:数据结构 地点:实验室 时间:
2012 年 11 月 23 日 学生姓名 班级 学号 成绩 组别 第一组 同组姓名 仪器编号 实验项目 栈 实验 指导教师 实验目的 掌握 栈 的基本操作 实验要求 栈的定义方法 基本操作算法 应用 实验环境 硬件:计算机 软件:windows XP, C 实验内容及实验结果 请写出具体的实验步骤,并给出相应的实验结果,附上编写的程序及其运行结果截图!结果截图:
技术原理:
一、关于栈:是限定只能在表的一端进行插入和删除操作的线性表;存储满足后进先出(LIFO)。
栈分顺序栈和链栈。对于链栈栈底就是链表的最后一个结点,栈顶总是链表的第一个结点。
二、对链栈的操作:
1.只能在链表头部进行操作 2.表示同线性表 3.头指针--栈顶指针 空栈 s.top==s.base push’A’ ,s.top++ 压入元素 pop(),s.top--s.base 始终指向栈底 s.abse==NULL 表示栈结构不存在 s.top==0 表示栈空 s.top 始终指向栈顶元素的下一个位置 三、实验步骤:
源程序:
#include
int stacksize;}sqstack;// 对栈进行初始化 int initstack(sqstack &s){ s.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));if(!s.base)exit(OVERFLOW);s.top=s.base;s.stacksize=STACK_INIT_SIZE;return OK;} // 进栈 int push(sqstack &s,int e){ if(s.top-s.base>=s.stacksize){ s.base=(int *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(int));if(!s.base)exit(OVERFLOW);s.top=s.base+s.stacksize;s.stacksize=s.stacksize+STACKINCREMENT;} *s.top=e;*s.top++;return OK;} // 出栈 int pop(sqstack &s,int &e){ if(s.base==s.top)return ERROR;e=*(s.top-1);*s.top--;return OK;} // 打印栈中元素 int printstack(sqstack s){ if(s.base==s.top){ printf(" 空栈n");return OK;}
else printf(" 栈内容是: ");for(;s.base!=s.top;s.base++){ printf("%d ",*s.base);} return OK;} int main(){ sqstack s;if(initstack(s))printf(" 初始化栈成功n");for(;;){ printf("n 请选择要进行的操作:n");printf("1 进栈 2 出栈 n3 打印 0 退出n");int select;scanf("%d",&select);if(select==0)break;switch(select){ case 0: break;case 1: int pushelem;printf(" 输入要进栈的元素: ");scanf("%d",&pushelem);if(push(s,pushelem))printf(" 进栈成功n");else printf(" 进栈失败n");break;case 2: int e;if(pop(s,e))printf(" 元素 %d 出栈n",e);else printf(" 出栈失败n");break;case 4: if(printstack(s))printf(" 打印完毕n");break;default:
printf(" 你进行了 错 误操作,请重新选择:n");break;} } return 1;} 实 实 验 验 心 心 得 得 教师评阅意见 教师签字 签字日期 年 年 月 日