实验一一个顺序栈的基本运算实验
一、实验目的:
对一个顺序栈的基本运算进行分析与设计,回顾数据结构所学过的知识,掌握一个顺序栈的基本运算实现,为下一步的实验奠定基础。
二、实验要求:
要求对一个顺序栈的基本运算作设计性实验,并上机运行,撰写实验报告。
三、实验内容:
一个顺序栈的数据类型表示和初始化、进栈、出栈基本运算。
四、实验环境:
Windows XP + VC++6.0开发环境。
五、实验步骤:
1、对顺序栈的知识进行复习,弄清楚栈的算法思想。
2、熟悉顺序栈的几种基本运算,即:
(1)初始化栈
int initStack(sqstack *s)
{/*创建一个空栈由指针S指出*/
if ((s=(sqstack*)malloc(sizeof(sqstack)))= =NULL) return FALSE;
s->top= -1;
return TRUE;
}
(2)入栈操作
int push(sqstack *s, Elemtype x)
{/*将元素x插入到栈s中,作为s的新栈顶*/
if(s->top>=MAXNUM-1) return FALSE; /*栈满*/
s->top++;
s->stack[s->top]=x;
return TRUE;
}
(3)出栈操作
Elemtype pop(sqstack *s)
{/*若栈s不为空,则删除栈顶元素*/
Elemtype x;
if(s->top<0) return NULL; /*栈空*/
x=s->stack[s->top];
s->top--;
return x;
}
(4)取栈顶元素操作
Elemtype gettop(sqstack *s)
{/*若栈s不为空,则返回栈顶元素*/
if(s->top<0) return NULL; /*栈空*/
return (s->stack[s->top]);
}
取栈顶元素与出栈不同之处在于出栈操作改变栈顶指针top的位置,而取栈顶元素操作不改变栈的栈顶指针.
(5)判栈空操作
int Empty(sqstack *s)
{/*栈s为空时,返回为TRUE;非空时,返回为FALSE*/
if(s->top<0) return TRUE;
return FALSE;
}
(6)置空操作
void setEmpty(sqstack *s)
{/*将栈s的栈顶指针top,置为-1*/
s->top= -1;
}
3、上机调试。
源代码如下:
#include<stdio.h>
#include<stdlib.h>
#define MAXNUM 30
#define Elemtype int
/*定义顺序栈的存储结构*/
typedef struct
{
Elemtype stack[MAXNUM];
i nt top;
}SqStack;
/*初始化顺序栈*/
void InitStack(SqStack *p){
if(!p) printf("error");
p->top=-1;
}
/*入栈*/
void Push(SqStack *p,Elemtype x){
if(p->top<MAXNUM-1) p->stack[++p->top]=x;
e lse printf("Overflow!\n");
}
/*出栈*/
Elemtype Pop(SqStack *p){
Elemtype x;
if(p->top!=0){
x=p->stack[p->top];
p rintf("栈顶元素%d已经被删除!\n",p->stack[p->top]);
p->top--;
r eturn (x);
}
else{
p rintf("Underflow!\n");
r eturn(0);
}
}
/*获取栈顶元素*/
Elemtype GetTop(SqStack *p)
{ if(p->top!=0) return (p->stack[p->top]);
else { printf("Underflow!\n");
return(0); }
}
/*遍历顺序栈*/
void OutStack(SqStack *p)
{ int i;
printf("\n");
if(p->top<0) printf("这是一个空栈!\n");
for(i=p->top; i>=0; i--)
printf("第%d个数据是:%6d\n", i, p->stack[i]);
}
/*置空顺序栈*/
void setEmpty(SqStack *p)
{ p->top=-1;
}
/*主函数*/
main(){
{ SqStack *q;
int y, cord;
Elemtype a;
do { printf("\n第一次使用必须初始化!\n");
printf("\n");
printf("\n ****************** 主菜单************* \n"); printf("\n * 1 初始化顺序栈 * \n"); printf("\n * 2 插入一个元素 * \n"); printf("\n * 3 删除栈顶元素 * \n"); printf("\n * 4 取栈顶元素 * \n"); printf("\n * 5 置空顺序栈 * \n"); printf("\n * 6 结束程序运行 * \n"); printf("\n------------------------------------------\n"); printf("请输入您的选择( 1, 2, 3, 4, 5, 6): ");
scanf("%d", &cord);
printf("\n");
switch(cord)
{ case 1: { q=(SqStack*)malloc(sizeof(SqStack));
InitStack(q);
OutStack(q);
} break;
case 2: { printf("请输入要插入的数据元素:a=");
scanf("%d",&a);
Push(q, a);
OutStack(q);
} break;
case 3: { Pop(q);
OutStack(q);
} break;
case 4: { y=GetTop(q);
printf("\n栈顶元素为:%d\n", y); OutStack(q);
} break;
case 5: { setEmpty(q);
printf("\n 顺序栈被置空!\n");
OutStack(q);
} break;
case 6: exit(0);
}
} while (cord<=6);
}
}
六、实验测试结果及分析:
当第一场运行时需要初始化,即输入1,
进行初始化之后我们就可正常对顺序栈运算了,以此类推,我们将可以测试出以下其它结果:
我们插入了多个元素,然后进行读取栈顶元素及置空,这样更明显些,
七、总结:
通过本实验,对顺序栈的算法思想重新温习了一遍,有了更进一步的了解和掌握,从而也为编译原理下一个实验奠定了基础。