顺序栈

基本定义

  1. 栈是仅限定在表尾进行插入和删除的操作的线性表
  2. LIFO:last in first out–后进先出
  3. 一片连续的存储单元

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;
}