一、实验目的和要求
目的:熟悉栈的创建,入栈,出栈等操作。
要求:编写程序任意输入栈长度和栈中的元素值,构造一个顺序栈,对其进行清空、销毁、入栈、出栈以及取栈顶元素操作。将从键盘输入的字符序列逆置输出.比如,从键盘上输入:tset a si sihT;算法将输出:This is a test。
二、实验内容
(1)入栈操作
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据即最后一个数据被第一个读出来。
栈的结构是“先进后出“的,就像堆积木一样,第一根放在最底层的地面上,然后一根一根往上堆。前一个放上去的总是被后一个放上去的压在底下。
入栈操作可以理解为:当我再向里面放一根的时候,就得放在最上面。
- 若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);
- 置TOP=TOP+1(栈指针加1,指向进栈地址);
- S(TOP)=X,结束(X为新进栈的元素);
(2)出栈操作
出栈操作可以理解为:当我从里面拿走一根积木的时候,就得从最上面拿。
- 若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②);
- X=S(TOP),(退栈后的元素赋给X);
- TOP=TOP-1,结束(栈指针减1,指向栈顶)。
三、依据的基本原理
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为出栈(POP)。栈也称为后进先出表。
从主函数上看,先初始化一个栈,根据用户输入的信息创建栈,并向栈里填充内容,随后进行判断该栈是否为空栈.
如果非空,则求出栈的长度,并且遍历输出栈里的所有元素.然后是入栈操作和删除栈顶元素的操作, 出栈后清空栈.
最后是输入一串字符,把字符逆序输出后,销毁栈.
四、实验步骤
首先引入几个必要的库,对一些文本进行替换(宏定义)以及定义顺序栈的类型为int型.
然后定义10个函数,分别是构建一个空栈, 销毁栈, 清空栈, 判断栈是否为空, 求栈的长度, 求栈顶元素, 栈顶插入元素, 删除栈顶元素, 遍历栈以及 将从键盘输入的字符序列逆置输出.
栈的操作主要看栈顶和栈底.栈顶等于栈底时,栈为空;栈顶减去栈底为栈的长度.
将从键盘输入的字符序列逆置输出,简单来说,就是把这个字符串一个个入栈,再一个个出栈,由于栈只能先进后出,因此输出时的字符串是逆序的, 由于栈的插入和删除操作具有它的特殊性,所以用顺序存储结构表示的栈并不存在插入删除数据元素时需要移动的问题
#include “stdio.h”
typedef char SElemType;
void ReverseRead()
{
STACK S; //定义一个栈结构S
char ch;
initstack(&S); //初始化栈
while ((ch=getchar())!='\n')
//从键盘输入字符,直到输入换行符为止
push(&S,ch); //将输入的每个字符入栈
while (!stackempty(S))
//依次退栈并输出退出的字符
{
pop( &S , ch );
putchar ( ch );
}
putchar('\n');
}
五、实验结果及分析
六、附录(程序源码)
//头文件
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
//宏定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int ElemType;
typedef int Status;
//栈的顺序结构表示
typedef struct
{
ElemType *base;
ElemType *top;
int stacksize;
}SqStack;
//1.构建一个空栈
Status InitStack