顺序栈
基本定义
- 栈是仅限定在表尾进行插入和删除的操作的线性表
- LIFO:last in first out–后进先出
- 一片连续的存储单元
SeqStack.h
#ifndef __SEQSTACK_H__
#define __SEQSTACK_H__
#define element x
typedef struct SeqStack
{
element *data; //data指向的空间来存储栈中的元素,动态数组,可以不事先定义大小
element maxlen; //栈中最多能存储的元素个数
element top; //栈顶元素的下标,-1表示空栈,栈中的元素个数=栈顶元素下标+1
}SeqStack;
/*
功能:初始化顺序栈
参数:指定最多可以存储多少元素
返回值:返回初始化的顺序栈指针
*/
SeqStack *InitStack(int maxL);
/*
功能:销毁顺序栈
参数:顺序栈指针
*/
void destroy(SeqStack *s);
/*
功能:清空顺序栈
参数:顺序栈指针
*/
void clear(SeqStack *s);
/*
功能:判断顺序栈是否为空或不存在
参数:顺序栈指针
返回值:空为1,非空位0
*/
int StackisEmpty(SeqStack *s);
//返回栈中元素的个数
int StackLength(SeqStack *s);
/*
功能:入栈
参数:@s:栈指针,表示入哪个栈;@x:要入栈的元素
返回值:1--成功;0--失败
*/
int push(SeqStack *s,elelment x);
/*
功能:出栈
参数:&s:栈指针;@e:指针:保存出栈元素
返回值:1--成功;0--失败
*/
int pop(SeqStack *s,elelment *e);
/*
GetTop:获取栈顶元素的值,但不出本
@s: 栈指针
@e: 指针,保存栈顶元素的值
返回值:
表示获取是否成功
1 表示成功
0 表示失败
*/
int GetTop(SeqStack *s, Selement *e);
/*
功能:遍历顺序栈
参数:栈指针
*/
void print(SeqStack *s);
#endif
SeqStack.c
#include<stdio.h>
#include<stdlib.h>
#include "SeqStack.h"
/*
功能:初始化顺序栈
参数:指定最多可以存储多少元素
返回值:返回初始化的顺序栈指针
*/
SeqStack *InitStack(int maxL)
{
SeqStack *s = malloc(sizeof(*s));
s->data = maollc(sizeof(element) * maxL);
s->maxlen = maxL;
s->top = -1;
return s;
}
/*
功能:销毁顺序栈
参数:顺序栈指针
*/
void destroy(SeqStack *s)
{
if(s == NULL)
{
return;
}
free(s->data);
free(s);
}
/*
功能:清空顺序栈
参数:顺序栈指针
*/
void clear(SeqStack *s)
{
if(s == NULL)
{
return;
}
s->top = -1;
}
/*
功能:判断顺序栈是否为空或不存在
参数:顺序栈指针
返回值:空为1,非空位0
*/
int StackisEmpty(SeqStack *s)
{
if(s == NULL || s->top == -1)
{
return 1;
}
return 0;
}
//返回栈中元素的个数
int StackLength(SeqStack *s)
{
if(s == NULL)
{
return 0;
}
return s->top+1;
}
/*
功能:入栈
参数:@s:栈指针,表示入哪个栈;@x:要入栈的元素
返回值:1--成功;0--失败
*/
int push(SeqStack *s,elelment x)
{
if(s == NULL || s->top+1 == s->maxlen)
{
return 0;
}
s->data[++s->top] = x; //因为s初始化为-1,要先+1
return 1;
}
/*
功能:出栈
参数:&s:栈指针;@e:指针:保存出栈元素
返回值:1--成功;0--失败
*/
int pop(SeqStack *s,elelment *e)
{
if(s == NULL || s->top = -1)
{
return 0;
}
*e = s->data[s->top--];
printf("出栈数为:%d\n",*e);
return 1;
}
/*
功能:获取栈顶元素的值,但不出栈
参数:@s: 栈指针;@e: 指针,保存栈顶元素的值
返回值:1--成功;0--失败
*/
int GetTop(SeqStack *s, Selement *e)
{
if(s == NULL || s->top == -1)
{
return 0;
}
*e = s->data[s->top];
return 1;
}
/*
功能:遍历顺序栈
参数:栈指针
*/
void print(SeqStack *s)
{
int i;
for(i = 0;i < s->maxlen;i++)
{
printf("第%d个元素值是%d\n",i+1,s->data[i]);
}
}
main.c
#include<stdio.h>
#include<stdlib.h>
#include "SeqStack.h"
int main()
{
int maxL,x,i;
printf("请输入栈最多元素的个数:\n");
scanf("%d",&maxL);
SeqStack *s = InitStack(maxL);
printf("请输入入栈元素:\n");
for(x = 0;x < maxL;x++)
{
scanf("%d",&i);
push(s,i);
}
print(s);
for(x = maxL-1;x > -1;x++)
{
pop(s,&i);
}
return 0;
}