当前位置:文档之家› 实验二_栈、队列地实现与应用

实验二_栈、队列地实现与应用

实验二栈、队列的实现及应用
实验课程名:数据结构与算法
专业班级:学号::
/*构造空顺序栈*/
int InitStack(SqStack *S) //InitStack() sub-function
{
S->base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if (!S->base)
{
printf("分配空间失败!\n");
return (ERROR);
}
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
printf("栈初始化成功!\n");
return (OK);
} //InitStack() end
/*取顺序栈顶元素*/
int GetTop(SqStack *S, SElemType *e) //GetTop() sub-function
{
if (S->top == S->base)
{
printf("栈为空!\n"); //if empty SqStack
return (ERROR);
}
*e = *(S->top - 1);
return (OK);
} //GetTop() end
/*将元素压入顺序栈*/
int Push(SqStack *S) //Push() sub-function
{
SElemType e;
if (S->top - S->base>S->stacksize)
{
S->base = (SElemType *)realloc(S->base, (S->stacksize +
STACKINCREMENT*sizeof(SElemType)));
if (!S->base)
{
printf("存储空间分配失败!\n");
return (ERROR);
}
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
fflush(stdin);//清除输入缓冲区,否则原来的输入会默认送给变量x
printf("请输入要入栈的元素的值:");
e = getchar();
*S->top++ = e;
return (OK);
} //Push() end
/* 将元素弹出顺序栈*/
int Pop(SqStack *S, SElemType *e) //Pop() sub-function {
if (S->top == S->base)
{
printf("栈为空!\n");
return (ERROR);
}
*e = *--S->top;
return (OK);
} //Pop() end
void display(SqStack *s)
{
if (s->top == s->base)
printf("栈为空!\n");
else{
while (s->top != s->base)
{
s->top = s->top - 1;
printf("%c->", *(s->top));
}
}
printf("\n");
}
int main()
{
int choice;
SElemType e;
SqStack s;
do
{
printf("===============================\n");
printf(" 0:退出\n");
printf(" 1:初始化栈\n");
printf(" 2:入栈\n");
printf(" 3:出栈\n");
printf(" 4:读取栈顶元素\n");
printf(" 5:显示栈中元素\n");
(3)结果分析
顺序表通过设置栈顶运用线性结构实现先进先出功能。

2.任务一(2):完成下列程序,该程序实现栈的链式存储结构,构建链栈(栈中的元素依次为China,Japan,France,India,Australia),依次进行进栈和出栈操作,判断栈空和栈满操作,返回栈顶元素操作。

要求生成链栈时,从键盘上读取数据元素。

(1)源代码:#include<stdio.h>
#include<stdlib.h>
#include<string.h>
# define OK 1
# define ERROR 0
typedef char DataType;
/* 链式栈的存储类型 */
typedef struct SNode //define structure LinkStack
{ DataType data[20];
struct SNode *next;
}SNode,*LinkStack;
void InitStack_L (LinkStack *top)
{
top = (LinkStack)malloc(sizeof(SNode)) ;
top->next = NULL;
printf("\n\n栈初始化成功!\n\n");
}
case '3':Pop_L(&s, e);break;
case '4':GetTop_L(&s, e);printf("栈顶元素的值是:%s\n",e);break; case '5': printf("栈中元素的值是: ");display(&s);
}
}while(choice);
return 0;
}
(2)运行结果
(3)结果分析
链表通过设置栈顶运用指针实现先进先出功能
3.任务二:完成下列程序,该程序实现循环队列的存储和基本操作,构建循环队列,完成键盘缓冲区的功能,每输入一个字符,链入缓冲区队列中;每输出一个字符,将该字符从缓冲区中删除。

(1)源代码:#include<stdio.h>
#include<stdlib.h>
# define MAXQSIZE 100
printf("请输入要入队的字符或字符串,以'#'结束:");
while((e=getchar())!='#')
{
EnQueue(&Q,e);
}
break;
case 2:
DeQueue(&Q,e);
break;
case 3: display(&Q);
}
}while(choice>0&&choice<=3);
return 0;
}
(2)运行结果
(3)结果分析
循环队列通过设置队首和队尾实现先进后出功能
实验总结:
1.在本次试验中我学会了如何实现的栈的顺序存储以及链式存储。

2.以及懂得了栈的基本特性:仅在表尾进行删除和插入操作、先进后出。

相关主题