数据结构:顺序栈的基本操作及应用
实验目的
通过该实验,让学生掌握栈的相关基本概念,认识栈是插入和删除集中在一端进行的线性结构,掌握栈的“先入后出”操作特点。栈在进行各类操作时,栈底指针固定不动,掌握栈空、栈满的判断条件。
实验内容
用顺序存储结构,实现教材定义的栈的基本操作,提供数制转换功能,将输入的十进制整数转换成二进制、八进制或十六进制。
参考界面
菜单中包括以下功能:
1.初始化栈,2.销毁栈,3.清空栈,4.栈判空,5.求栈长度,6.获取栈顶元素,7.插入一个 元素,8.删除一个元素,9输出所有元素,10进制转换。
要求:自定义的函数中不允许出现提示语和输出语句。
验收
通过菜单调用各个操作,测试点:
- 没有初始化前进行其他操作,程序是否能控制住;
- 初始化一个栈;
- 判栈空,屏幕显示栈为空;
- 3个数入栈, 2、4、6;
- 栈长度,屏幕输出3;
- 取栈顶元素,再判栈空,然后再判栈长度。让学生知道取栈顶元素不改变栈中的内容,栈顶指针不发生改变;
- 出栈,再判栈长度和输出栈中内容;(多次出栈,直到栈为空;再出栈,是否提示栈为空)
- 销毁栈,再做其他操作,判断程序是否能控制;
- 数制转换,(允许用户输入想把十进制转换成几进制),然后灵活的转换成对应的进制。
具体代码如下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
//--------------栈的顺序存储表示-------------------
#define INIT_SIZE 100 //初始分配量
#define CREMENT 10 //分配增量
typedef int status; //status是函数的类型,其值是函数结果状态代码。
typedef int SElem; //自定义
/*
base:在栈构造之前和销毁之后,base 的值为NULL
top:栈顶指针
stacksize:目前已经分配的存储空间,以元素为单位
*/
typedef struct {
SElem * base;
SElem * top;
int stacksize;
}SqStack;
//---------------基本操作的函数原型说明------------
status InitStack(SqStack *S);
//构造一个空栈S
status DestroyStack (SqStack *S);
//销毁栈S
status ClearStack (SqStack *S);
//清空栈S
static StackEmpty(SqStack *S);
//判空栈S
int StackLength(SqStack S);
//求栈S的长度
status GetTop(SqStack S,SElem *e);
//获取栈顶元素
status Push(SqStack *S,SElem e);
//插入一个元素(压入)
status Pop(SqStack *S,SElem *b);
//删除一个元素(弹出)
//---------------主函数----------------------------
int main (){
int i;
SqStack L = {
NULL,NULL,0};
SElem num;
int choice;
while (1){
//菜单
printf("\t\t\t 1---初始化一个栈\n");
printf("\t\t\t 2---销毁栈\n");
printf("\t\t\t 3---清空栈\n");
printf("\t\t\t 4---判断栈是否为空\n");
printf("\t\t\t 5---求栈长度\n");
printf("\t\t\t 6---获取栈顶元素\n");
printf("\t\t\t 7---插入一个元素\n");
printf("\t\t\t 8---删除一个元素\n");
printf("\t\t\t 9---输出所有元素\n");
printf("\t\t\t 10--进制转换\n");
printf("\t\t\t 退出,输入一个负数!");