栈:是线性表的一种特殊的表现形式,与队列的“先来先服务不同”,栈执行的则是“后进先出”原则(如图所示)
那么在栈中则还应该注意的是什么呢? 操作流程 :栈只能在一段操作也就是在栈顶来进行操作的
其实这就是一个数组,栈底的初始化是base[0],然后依次往上加,到你的MAXSIZE元素。
那么函数怎样解释呢
SeqStack* SeqStackInit() //初始化,来进行分配空间
{
SeqStack* p;
if (p = (SeqStack*)malloc(sizeof(SeqStack)))
{
p->top = 0; //设置栈顶为0
return p;
}
return NULL;
}
但是有的是是这样写的
Status InitStack(SqStack *S)
{
/* S.data=(SElemType *)malloc(MAXSIZE*sizeof(SElemType)); */
S->top=-1;
return OK;
}
//为啥要让S.top(栈顶)来指向-1呢?
//因为初始化为空栈,然后规定空栈的时候指向-1,这样在有第一个元素入栈的时候栈顶指针就可以通过自加指向元素,从而避免其它判断,所以直接指向了-1.
下一步就是内存的释放了。(但是我查了一下,他们只是声明内存中堆和栈的五个区别,但是和我空间释放有啥关系嘞)栈的释放_chinaplus的博客-CSDN博客_释放栈
void SeqStackFree(SeqStack* s)
{
if (s)
free(s);//空间的释放
}
之后的函数就是来判断你的栈是否清空的情况了。
int SeqStackIsEmpty(SeqStack* s)
{
return (s->top==0); //判断栈顶是否为空
// 但是我如果不是空的情况咋不考虑呢
//其实没有必要的
//有的人这样写的
/*if (S.top==-1)
return TRUE;
else
return FALSE; */
}
void SeqStackClear(SeqStack* s)
{
s->top = 0; //清空栈
}
int SeqStackIsFull(SeqStack* s)//判断栈是否已经满了
{
return (s->top== SIZE);
}
其实少添加一个对于栈长度的返回,这个用函数
return S.top+1;
对自己栈插入一个元素
int SeqStackPush(SeqStack* s, DATA data)
{
if ((s->top + 1) > SIZE)
{
printf("栈溢出\n");
return 0;
}
s->data[++s->top] = data;
return 1;
}
之后便是出栈的准备了。
DATA SeqStackPop(SeqStack* s)
{
if (s->top == 0)
{
printf("栈为空!");
exit(0);
} //有没有发现那个入栈和出栈十分的相似呀,他们首先是来判断,不同的只不过是返回值不一
return (s->data[s->top--]);
}
返回栈顶元素
DATA SeqStackPeek(SeqStack* s)
{
if (s->top == 0)
{
printf("栈为空!");
exit(0);
}
return(s->data[s->top]);
}
//其实和入栈 出栈 几乎一样的
人家写的和我有出数据结构-栈_zxucver的博客-CSDN博客_数据结构栈
那么完全代码如下;
SeqStack.h
#define SIZE 50
typedef struct
{
char name[15];
int age;
}DATA;
typedef struct stack
{
DATA data[SIZE + 1];
int top;
int base;
}SeqStack;
SeqStack* SeqStackInit();
void SeqStackFree(SeqStack* s);
int SeqStackIsEmpty(SeqStack* s);
void SeqStackClear(SeqStack* s);
int SeqStackIsFull(SeqStack* s);
int SeqStackPush(SeqStack* s,DATA data);
DATA SeqStackPop(SeqStack* s);
DATA SeqStackPeek(SeqStack* s);
SeqStack(main).c
#include <stdio.h>
#include <stdlib.h>
#define SIZE 50
#include "SeqStack.h"
int main()
{
SeqStack* stack;
DATA data, data1;
stack = SeqStackInit(); //初始化
printf("入栈操作:\n");
printf("输入姓名 年龄 入栈操作:");
scanf("%s%d", data.name, &data.age);
SeqStackPush(stack, data);
printf("输入姓名 年龄 入栈操作");
scanf("%s%d", data.name, &data.age);
SeqStackPush(stack, data);
printf("\n出栈操作:\n 任意键进行出栈操作:");//其实这个没有函数的
getchar();
data1 = SeqStackPop(stack);
printf("出栈的数据是(%s,%d)\n", data.name, &data.age);
SeqStackPeek(stack);
getchar();
return 0;
}
SeqStack(函数设置部分).c
#include "SeqStack.h"
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#define SIZE 50
SeqStack* SeqStackInit()
{
SeqStack* p;
if (p = (SeqStack*)malloc(sizeof(SeqStack)))
{
p->top = 0; //设置栈顶为0
return p;
}
return NULL;
}
void SeqStackFree(SeqStack* s)
{
if (s)
free(s);//空间的释放
}
int SeqStackIsEmpty(SeqStack* s)
{
return (s->top==0); //判断栈顶是否为空
}
void SeqStackClear(SeqStack* s)
{
s->top = 0; //清空栈
}
int SeqStackIsFull(SeqStack* s)
{
return (s->top== SIZE);
}
int SeqStackPush(SeqStack* s, DATA data)
{
if ((s->top + 1) > SIZE)
{
printf("栈溢出\n");
return 0;
}
s->data[++s->top] = data;
return 1;
}
DATA SeqStackPop(SeqStack* s)
{
if (s->top == 0)
{
printf("栈为空!");
exit(0);
}
return (s->data[s->top--]);
}
DATA SeqStackPeek(SeqStack* s)
{
if (s->top == 0)
{
printf("栈为空!");
exit(0);
}
return(s->data[s->top]);
}
分享到这了,谢谢。