实验二栈和队列基本操作与应用

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序2:队列运算在顺序存储结构上的实现
假定采用Queue记录类型的对象Q来表示顺序存储的队列,则在Q上进行各种队列运算
三、实验过程要求
1、分组形式:学生自行分组,每组3人,汇总到课代表处,课代表在本周末前mail告诉我;
2、组内分工与协作:
1)同一小组的同学在上机前讨论确定问题可以采用的数据结构、流程的安排、模块的划分等,共同完成上机前的准备工作,并对要编制的代码进行分工;
Pop(Sa,&e);
printf("%s\n%s\n%d\n%d\n",e.name,e.stuno,e.age,e.score);
printf(" Let's see the left of Stack's elem:\n");
StackTraverse(*Sa,StackPrintElem);
选题一、算术表达式求值演示(3人/组)
程序1用顺序栈实现算术表达式求值。
将表达式看成字符串序列,输入语法正确、不含有变量的整数表达式(表达式中的数字限为单位数),利用算符的优先关系,把中序表达式转换为后序表达式后输出,然后求出该后序表达式的值。
程序2用链栈实现算术表达式求值。(与程序1的基本要求相同)
{
printf("%s %s %d %d\n",e->name,e->stuno,e->age,e->score);
}
Status StackTraverse(SqStack S,Status (*visit)())
{
while(S.top!=S.base)
visit(--S.top);
}
main()
InitStack(&Sa);
strcpy(e.name,"stu1");
strcpy(e.stuno,"100001");
e.age=80;
e.score=1000;
printf(" Now Stack is Empty.\n");
StackTraverse(*Sa,StackPrintElem);
}
Status StackEmpty(SqStack S)
{
if(S.topຫໍສະໝຸດ Baidu=S.base) return TRUE;
else
return FALSE;
}
int StackLength(SqStack S)
{
int i;
SElemType *p;
i=0;
p=S.top;
while(p!=S.base)
实验二
第三章栈和队列上机实验
一、实验时间与地点
第一组和第二组
时间:2011-4-13,星期三,3,4节10:10—11:50;
地点:信息学院实验中心,弘毅楼D406、407。
班级:信息091-3第一和第二小组;
二、实验内容
【实验目的】
深入理解栈和队列的特性,领会它的应用背景。熟练掌握在不同存储结构、不同的约定中,其基本操作的实现方法与差异。并体会以下几点(注意你所做的约定):
2)每个同学上机时完成自己那部分程序模块的编制和调试(单体测试);
3)同组同学在单体测试通过后,完成整个程序的联调;
4)联调通过后,检查上机结果,并可以进一步讨论该程序可以改进的地方或扩展的功能及其方法。
四、实验报告的要求:
每人交一份实验报告,实验报告的内容包括:
1)实验报告中的需求分析、数据结构选择、模块及流程设计等是大家共同讨论的结果;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue &Q) {
//构造一个空队列Q
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
{p++;
i++;
}
}
Status GetTop(SqStack S,SElemType *e)
{
if(S.top==S.base) return ERROR;
*e=*(S.top-1);
return OK;
}
Status Push(SqStack *S,SElemType e)
{
/*
if(S->top - S->base>=S->stacksize)
}
*/
*(S->top++)=e;
return OK;
}
Status Pop(SqStack *S,SElemType *e)
{
if(S->top==S->base) return ERROR;
*e=*--S->top;
return OK;
}
Status StackPrintElem(SElemType * e)
#define TRUE 1
#define FALSE 0
#define OK 1
#define EQUAL 1
#define OVERFLOW -1
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status ;
struct STU{
Q.front=Q.rear;
}
return OK;}
Status EnQueue(LinkQueue &Q,QElemType e) {
//队列Q存在,插入元素e为Q的队尾元素
p=(QueuePtr)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
p->data=e;p->next=NULL;
int StackLength(SqStack S);
Status GetTop(SqStack S,SElemType *e);
Status Push(SqStack *S,SElemType e);
Status Pop(SqStack *S,SElemType *e);
Status StackTraverse(SqStack S,Status (*visit)());
Push(Sa,e);
printf(" Now Stack has one element.\n");
StackTraverse(*Sa,StackPrintElem);
strcpy(e.name,"stu3");
strcpy(e.stuno,"100002");
e.age=80;
e.score=1000;
2)实验报告中需要注明组内人员的具体分工(编码和文档写作)和作业投入时间;
3)实验报告中必须附上每个同学的实验体会(协同设计、编程、单体调试、联调、程序的可改进和可扩展的说明、栈的使用总结、对本课程的教学与实验的建议等);
4)以上实验报告内容装订成册,在本次实验上机结束后一周内交给老师。
五、选作实验
Status InitStack(SqStack **S)
{
(*S)=(SqStack *) malloc(sizeof(SqStack));
(*S)->base=(SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType));
if(!(*S)->base)exit(OVERFLOW);
{
SElemType e;
SqStack *Sa;
clrscr();
printf("\n\n-------------------SqStack Demo is running...----------------\n\n");
printf("First is Push function.\n");
Q.rear->next=p;
Q.rear=p;
return OK;}
Status DeQueue(LinkQueue &Q,QElemType &e) {
//Q为非空队列,删除Q的队头元素,并用e返回其值
if(Q.front==Q.rear)return ERROR;
p=Q.front->next;
(*S)->top=(*S)->base;
(*S)->stacksize=STACK_INIT_SIZE;
return OK;
}
Status DestroyStack(SqStack *S)
{
free(S->base);
free(S);
}
Status ClearStack(SqStack *S)
{
S->top=S->base;
1、顺序栈(初始化、栈空/栈满条件,入栈/出栈);
2、链栈(初始化、栈空条件,入栈/出栈);
3、顺序队列
4、链队列
【实验选题】
选题一、栈的基本操作的实现(1人/组)
实验1要求
1.会定义顺序栈和链栈的结点类型。
2.掌握栈的插入和删除结点在操作上的特点。
3.熟悉对栈的一些基本操作和具体的函数定义。
具体内容
{
S->base=(SElemType *) realloc(S->base,
(S->stacksize + STACKINCREMENT) * sizeof(SElemType));
if(!S->base)exit(OVERFLOW);
S->top=S->base+S->stacksize;
S->stacksize += STACKINCREMENT;
程序1
该程序的功能是实现顺序栈的定义和操作。该程序包括定义的栈结构类型以及对每一种栈操作的具体的函数定义和主函数。
选题二、队列基本操作的实现(1人/组)
实验2要求
4.会定义顺序队列和链队的结点类型。
5.掌握队列的插入和删除结点在操作上的特点。
6.熟悉对队列的一些基本操作和具体的函数定义。
具体内容
程序1:链队列表示和实现
Push(Sa,e);
printf(" Now Stack has another element.\n");
StackTraverse(*Sa,StackPrintElem);
printf(" Now Pop Stack,the top elem put into variable e.\n");
typedef struct STACK *pSqstack;
Status InitStack(SqStack **S);
Status DestroyStack(SqStack *S);
Status ClearStack(SqStack *S);
Status StackEmpty(SqStack S);
if(!Q.front)exit(OVERFLOW);
Q.front->next=NULL;
return OK;}
Status Destroyqueue(LinkQueue &Q) {
//队列Q存在则销毁Q
while(Q.front){
Q.rear=Q.front->next;
free(Q.front);
char name[20];
char stuno[10];
int age;
int score;
};
typedef struct STU SElemType;
struct STACK
{
SElemType *base;
SElemType *top;
int stacksize;
};
typedef struct STACK SqStack;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)Q.rear=Q.front;
free(p);
return OK;}
栈运算在顺序存储结构上的实现
#include<stdio.h>
#include<malloc.h>
#include<conio.h>
#define ERROR 0
同学必须完成选题中“基本要求”规定的内容,对于“选作内容”可以根据自己小组的实际情况进行分析、设计或实现。
六、参考源程序
1、部分程序见教材中相关章节!
2、下面给出一个顺序栈基本操作的完整程序,链队列的核心部分参考程序:
链队列表示和实现:
//存储表示
typedef struct QNode{
QElemType data;
getch();
printf("\n\n\nWelcom to visit http://zmofun.topcool.net\n\n");
}
3另外栈和队列简单应用及较完整的基本操作参考程序见扫描文件
相关文档
最新文档