栈
栈的定义:
栈(stack)是限定在表尾进行插入或删除操作的线性表。
表位端称为栈顶(top),表头段称为栈尾(botttom).不含元素的空表称为空栈。
特点:先进后出或后进先出。
顺序栈的表现与实现:
顺序栈是指利用顺序存储结构实现的栈,也就是说利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。当top和base的值(地址)相等时,表示空栈。
具体操作:
顺序栈的初始化:就是为顺序栈动态分配一个预定义大小的数组空间。
入栈:在栈顶插入新的元素。
出栈:将栈顶元素删除。
判断栈空:就是看栈顶指针和栈尾指针是否指向同一位置。
返回栈的长度;就是将栈顶指针减去栈尾指针(指针的减法)。
遍历输出栈的所有元素:栈顶指针位置减1所指向的元素。
然后利用循环依次实现栈的输出,具体操作看函数StackTraverse(S);注意这里的参数
完毕。
实验源代码:
#define _CRT_SECURE_NO_WARNINGS 1
//栈和队列基本操作的实现
//栈的建立与初始化、入栈、出栈、判断栈空,额外(返回栈的长度,)
//顺序栈的操作如下
#include <stdlib.h> //包含函数exit(overflow)
#include <stdio.h>
#define MAXSIZE 100
#define STACKINCREMENT 10
#define OK 1
#define OVERFLOW -1
#define ERROR
typedef int SElemtype;
typedef struct {
SElemtype* top;//栈顶指针
SElemtype* base;//栈底指针
SElemtype stacksize;//栈的最大可容纳空间
}SqStack;
SqStack S;
//建立空栈 ,栈的初始化
int InitStack(SqStack* S)//建立空栈S
{
S->base = (SElemtype*)malloc(MAXSIZE * sizeof(SElemtype));//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
//并且让base这个指针指向这段空间的基地址。
if (!S->base)
{
exit(OVERFLOW);
}
S->top = S->base;//将栈顶指针指向栈底指针等于空栈
S->stacksize = MAXSIZE;
return OK;
}
//入栈
int Push(SqStack* S, SElemtype e)
{
if (S->top - S->base == S->stacksize)
{
return ERROR;
}
*S->top++ = e;//栈顶指针减一然后将新的栈顶指针所指向的值赋值给e
return OK;
}
//出栈
int Pop(SqStack* S, SElemtype e)
{
if (S->top == S->base)
{
return ERROR;
}
e = *--S->top;
printf("出栈的元素为%d\n", e);
return OK;
}
//判断栈空
void Nulljust(SqStack* S)
{
if (S->top == S->base)
{
printf("空栈\n");
}
else
printf("不是空栈\n");
}
//额外操作 1返回栈的长度
void LengthStack(SqStack S)
{
int length = S.top - S.base;
printf("%d\n",length);
}
//遍历栈的每个元素
int StackTraverse(SqStack S)
{
if (S.base == S.top)
{
return ERROR;
}
while (S.base != S.top)
{
int b = *(S.top-1);//一开始我减去1输出错误,又忘了加上括号输出的是地址
//代表指针位置减一然后就是将指向的值赋值给b
printf("%d", b);
S.top--;
}
printf("\n");
}
void menu()
{
int i = 0;
printf("-----------主菜单---------------\n");
printf("1-------------入栈\n");
printf("2-------------出栈\n");
printf("3-------------判断栈空\n");
printf("4-----------返回栈的长度\n");
printf("5--------遍历输出栈的全部元素\n");
printf("0------退出\n");
do{
printf("请选择:\n");
scanf("%d", &i);
switch (i) {
case 1:
{
int a = 0;
printf("请输入元素\n");
scanf("%d", &a);
Push(&S, a);
break;
}
case 2:
{
int b = 0;
Pop(&S, b);
break;
}
case 3: {
Nulljust(&S);
break;
}
case 4: {
LengthStack(S);
break;
}
case 5: {
StackTraverse(S);
break;
}
case 0: {
printf("程序正常退出");
exit(0);
}
default:
printf("输入错误,请重新输入");
}
} while (1);
}
int main()
{
InitStack(&S);
menu();
return 0;
}