顺序栈和链栈的基本操作 命令选择性的测试程序.docx
- 文档编号:8234838
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:20
- 大小:413.57KB
顺序栈和链栈的基本操作 命令选择性的测试程序.docx
《顺序栈和链栈的基本操作 命令选择性的测试程序.docx》由会员分享,可在线阅读,更多相关《顺序栈和链栈的基本操作 命令选择性的测试程序.docx(20页珍藏版)》请在冰豆网上搜索。
顺序栈和链栈的基本操作命令选择性的测试程序
工作(学习)日志
日期时间:
2012年11月1日21:
51:
04
主题:
顺序栈和链栈的基本命令选择性的测试程序
内容:
Stack.c文件中的内容:
/*这个测试程序开始时可以单独进行任意一种操作命令,也可以按照1234或5678的顺序依次操作*/
#include
#include
#include"lc.h"
#defineElemTypeint
#defineMAXSIZE50
typedefstruct//顺序栈是一个连续的存储空间,来存放元素
{
ElemTypedata[MAXSIZE];
inttop;//栈顶指针,初始化为-1;
}SqStack;
typedefstructlinkstack_node//这里的linkstack_node为什么要定义呢?
因为下面的*next定义的时候需要一个变量类型,这里就是提前进行定义一个变量类型
{
ElemTypedata;
structlinkstack_node*next;//链栈是由一个一个的结点构成的
}LinkStack;//为什么要这么(用类型定义符)定义呢?
因为如果是直接用struct+新的类型名定义的话,以后如果仍然需要定义一个该结构体类型的变量
//时,在C语言中就每次都得加上struct,很麻烦,上面定义linkstack_node*next的时候就是这样,前面的struct不能省略,so……
/*******************第一部分:
顺序栈的基本操作*************/
/*********************栈的初始化***********************/
SqStack*InitSqStack()
{
SqStack*S;
S=(SqStack*)malloc(sizeof(SqStack));
S->top=-1;
returnS;
}
/*********************done****************************/
/*********************判栈空***********************/
StatusEmptySqStack(SqStack*S)
{
if(S->top==-1)
{
printf("\n栈空\n");
returnTRUE;
}
else
{
printf("\n栈不空\n");
returnFALSE;
}
}
/*********************done****************************/
/*********************打印栈的内容********************/
voidPrintSqStack(SqStack*S)
{
intn;
printf("\n栈的当前内容:
<栈底");
for(n=0;n<=S->top;n++)
printf("%d",S->data[n]);
printf("栈顶>\n");
}
/*********************done****************************/
/*********************顺序栈的入栈*******************/
StatusPush_SqStack(SqStack*S,ElemTypex)
{
if(S->top==MAXSIZE-1)
{
printf("\n栈已满\n");
returnERROR;
}
else
{
S->top++;
S->data[S->top]=x;
returnOK;
}
}
/*********************done****************************/
/*********************顺序栈的出栈*******************/
ElemTypePop_SqStack(SqStack*S)
{
EmptySqStack(S);
returnS->data[S->top--];
}
/*********************done****************************/
/*******************第二部分:
链栈的基本操作*************/
/*********************栈的初始化***********************/
LinkStack*Init_LinkStack()
{
LinkStack*S;
S=(LinkStack*)malloc(sizeof(LinkStack));
S->next=NULL;
returnS;
}
/*********************done****************************/
/*********************判栈空***********************/
StatusEmpty_LinkStack(LinkStack*S)
{
if(S->next==NULL)
{
printf("\n栈空\n");
returnTRUE;
}
else
{
printf("\n栈不空\n");
returnFALSE;
}
}
/*********************done****************************/
/*********************打印栈的内容********************/
voidPrint_LinkStack(LinkStack*S)
{
LinkStack*p;
p=S->next;
printf("\n当前栈为:
<栈顶");
while(p)
{
printf("%d",p->data);
p=p->next;
}
printf("栈底>\n");
}
/*********************done****************************/
/*********************链栈的入栈(链表的头插入法)*******************/
StatusPush_LinkStack(LinkStack*S,ElemTypex)
{
LinkStack*L;
L=(LinkStack*)malloc(sizeof(LinkStack));
L->data=x;
L->next=S->next;
S->next=L;
returnOK;
}
/*********************done****************************/
/*********************链栈的出栈*******************/
ElemTypePop_LinkStack(LinkStack*S)
{
LinkStack*L;
L=S->next;
if(L)
{
S->next=L->next;
returnL->data;
}
else
{
printf("\n栈空\n");
returnS->data;
}
}
/*********************done****************************/
/*************显示菜单********************************/
voidShow_menu()
{
printf("※顺序栈操作|※链栈操作\n");
printf("1)栈初始化|5)栈初始化\n");
printf("2)栈判空|6)栈判空\n");
printf("3)入栈|7)入栈\n");
printf("4)出栈|8)出栈\n");
printf("0)退出程序\n");
printf("请输入要进行的操作:
");
}
/*********************done****************************/
voidmain()
{
LinkStack*s1;
ElemTypeR;//必须在前面定义,程序过程中是不能定义的?
?
?
这个地方有点疑问,还没确定
//第一部分顺序栈的测试程序
SqStack*s;//这个地方开始的时候是这样的:
SqStacks;不大理解为何在栈区(编译时自动分配栈区地址)
//定义了一个再用malloc()开辟空间,然后再赋值……不大懂?
,原来正确的应该是在此处定义一个指向栈的指针,此时指针未赋值,所以……
ElemTyper;
intchoice;
intpush1=0,push2=0;//pop初始化标志符号
while
(1)
{
Show_menu();
scanf("%d",&choice);
if(choice==0)break;
switch(choice)
{
case1:
s=InitSqStack();
printf("\n初始化完毕\n");
PrintSqStack(s);
break;//switchcase语句中case后面有多个语句时可以不用{}括起来
case2:
s=InitSqStack();
EmptySqStack(s);
break;//switchcase语句中case后面有多个语句时可以不用{}括起来
case3:
if(!
push1)s=InitSqStack();//只在第一次进行入栈操作的时候执行初始化程序*******很重要的一个方法,标志法
while
(1)
{
printf("\n请输入要入栈的值:
(输入0结束)");
scanf("%d",&r);
if(r)
{
Push_SqStack(s,r);
push1++;//供下面检测是否已经进行入栈操作
PrintSqStack(s);
}
else
break;
}
break;//switchcase语句中case后面有多个语句时可以不用{}括起来
case4:
if(!
push1)//若开始时没有进行入栈操作,则程序自己进行入栈操作
{
s=InitSqStack();
PrintSqStack(s);
Push_SqStack(s,100);
Push_SqStack(s,200);
Push_SqStack(s,300);
Push_SqStack(s,400);
Push_SqStack(s,500);
Push_SqStack(s,600);
PrintSqStack(s);
}
Pop_SqStack(s);
PrintSqStack(s);
push1++;
EmptySqStack(s);
break;//switchcase语句中case后面有多个语句时可以不用{}括起来
case5:
s1=Init_LinkStack();
printf("\n初始化完毕\n");
Print_LinkStack(s1);
break;//switchcase语句中case后面有多个语句时可以不用{}括起来
case6:
s1=Init_LinkStack();
Empty_LinkStack(s1);
break;//switchcase语句中case后面有多个语句时可以不用{}括起来
case7:
if(!
push2)s1=Init_LinkStack();//只在第一次进行入栈操作的时候执行初始化程序*******很重要的一个方法,标志法
while
(1)
{
printf("\n请输入要入栈的值:
(输入0结束)");
scanf("%d",&R);
if(R)
{
Push_LinkStack(s1,R);
Print_LinkStack(s1);
push2++;//供下面检测是否已经进行入栈操作
}
else
break;
}
break;//switchcase语句中case后面有多个语句时可以不用{}括起来
case8:
if(!
push2)//若开始时没有进行入栈操作,则程序自己进行入栈操作
{
s1=Init_LinkStack();
Print_LinkStack(s1);
Push_LinkStack(s1,100);
Push_LinkStack(s1,200);
Push_LinkStack(s1,300);
Push_LinkStack(s1,400);
Push_LinkStack(s1,500);
Push_LinkStack(s1,600);
Print_LinkStack(s1);
}
Pop_LinkStack(s1);
Print_LinkStack(s1);
push2++;
Empty_LinkStack(s1);
break;//switchcase语句中case后面有多个语句时可以不用{}括起来
}
}
printf("\n程序已退出\n");
/*//第二部分链栈的测试程序
//初始化链栈
s1=Init_LinkStack();
//判空?
Empty_LinkStack(s1);
//入栈
printf("\n请输入你要入栈的值:
");
scanf("%d",&R1);
Push_LinkStack(s1,R1);
Print_LinkStack(s1);
printf("\n请输入你要入栈的值:
");
scanf("%d",&R2);
Push_LinkStack(s1,R2);
Print_LinkStack(s1);
printf("\n请输入你要入栈的值:
");
scanf("%d",&R3);
Push_LinkStack(s1,R3);
Print_LinkStack(s1);
//出栈
printf("\n\n出栈操作\n");
Print_LinkStack(s1);
printf("第一次出栈结果");
Pop_LinkStack(s1);
Print_LinkStack(s1);
printf("第二次出栈结果");
Pop_LinkStack(s1);
Print_LinkStack(s1);
printf("第三次出栈结果");
Pop_LinkStack(s1);
Print_LinkStack(s1);
*/
}
Lc.h中的内容:
#ifndef_LC_H_
#define_LC_H_
//函数结果状态代码
constintTRUE=1;
constintFALSE=0;
constintOK=1;
constintERROR=0;
constintINFEASIBLE=-1;
constintOVERFLOW=-2;
//Status是函数的类型,其值是函数结果状态代码
typedefintStatus;
#endif//_LC_H_
结果:
按顺序来操作的顺序栈操作:
按顺序来操作的链栈操作:
不按顺序来操作的顺序栈操作:
先入栈,后出栈
直接出栈:
不按顺序来的链栈操作:
先入栈,再出栈
开始就进行链栈出栈操作:
心得:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 顺序栈和链栈的基本操作 命令选择性的测试程序 顺序 基本 操作 命令 选择性 测试 程序