那么在栈中则还应该注意的是什么呢? 操作流程 :栈只能在一段操作也就是在栈顶来进行操作的
其实这就是一个数组,栈底的初始化是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->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); //判断栈顶是否为空
// 但是我如果不是空的情况咋不考虑呢
//其实没有必要的
//有的人这样写的
}
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#include #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#include #include #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]); }
分享到这了,谢谢。



