数据结构与算法之——顺序栈

栈:栈是限定仅能在表尾进行插入和删除操作的线性表。

栈是一种特殊的线性表,它具有线性表的属性即有前驱和后继,但不同于线性表可以在任意位置插入和删除元素,它只能在表尾进行,因此先入的元素会被压入栈底,而后入的元素却会首先被弹出来。因此它是 Last In First Out即后进先出的。

栈的抽象数据类型表示:

ADT 栈(stack)

   Data

    同线性表,元素具有相同的数据类型,相邻元素具有前驱和后继关系

Operation

   InitStack(*S);  初始化操作,建立一个空栈S

   DestroyStack(*S);   栈栈存在,则销毁它

   ClearStack(*S); 将栈清空

   StackEmpty(S);  若栈为空,返回true,否则返回false

   GetTop(S,*e);   若栈存在且非空,用e返回S的栈顶元素

   Push(*S,e); 若栈S存在,将新元素e插入栈S中并成为栈顶元素

   Pop(*S,*e); 删除栈S中栈顶元素,并用e返回其值

   StackLength(S); 返回栈S的长度

endADT


顺序栈的代码实现

SqStack.h

/* 顺序栈 */

#define MAXSIZE 5
typedef int SElemType;
typedef struct
{
    SElemType data[MAXSIZE];
    int top;
}SqStack;

#define OK 1
#define ERROR 0
typedef int Status;

Status InitStack(SqStack *S);   //初始化操作,建立一个空栈S
Status DestroyStack(SqStack *S);    //栈栈存在,则销毁它
Status ClearStack(SqStack *S);  //将栈清空
int StackEmpty(SqStack S);  //若栈为空,返回true,否则返回false
Status GetTop(SqStack S,SElemType *e);  //若栈存在且非空,用e返回S的栈顶元素
Status Push(SqStack *S,SElemType e);    //若栈S存在,将新元素e插入栈S中并成为栈顶元素
Status Pop(SqStack *S,SElemType *e);    //删除栈S中栈顶元素,并用e返回其值
int StackLength(SqStack S); //返回栈S的长度
SqStack.c

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include "SqStack.h"

int main(void)
{
	SqStack S;
	InitStack(&S);
	printf("已初始化好,现在压栈1,2,3,4");
	Push(&S,1);
	Push(&S,2);
	Push(&S,3);
	Push(&S,4);
	printf("\n现在的长度是:%d\n",StackLength(S));
	printf("现在依次弹栈:");
	SElemType e ;
	Pop(&S,&e);
	printf("%d,",e);
	Pop(&S,&e);
	printf("%d,",e);
	Pop(&S,&e);
	printf("%d,",e);
	Pop(&S,&e);
	printf("%d,",e);
	printf("\n现在的长度是:%d\n",StackLength(S));
	
	return 0;
}

Status InitStack(SqStack *S)	//初始化操作,建立一个空栈S
{
	memset(S->data,0,sizeof(SElemType)*MAXSIZE);
	S->top = -1;
	return OK;
}
Status DestroyStack(SqStack *S)	//栈栈存在,则销毁它
{
	//free(S);
	return OK;
}
Status ClearStack(SqStack *S)	//将栈清空
{
	S->top = -1;
	memset(S->data,0,sizeof(SElemType)*MAXSIZE);
	return OK;
}
int StackEmpty(SqStack S)	//若栈为空,返回true,否则返回false
{
	return S.top == -1;
}
Status GetTop(SqStack S,SElemType *e)	//若栈存在且非空,用e返回S的栈顶元素
{
	if(StackEmpty(S))
	{
		return ERROR;
	}
	*e = S.data[S.top];
	return OK;
}
Status Push(SqStack *S,SElemType e)	//若栈S存在,将新元素e插入栈S中并成为栈顶元素
{
	if(S->top == MAXSIZE -1)
	{
		return ERROR;//已满
	}
	S->top++;
	S->data[S->top] = e;
	return OK;
}
Status Pop(SqStack *S,SElemType *e)	//删除栈S中栈顶元素,并用e返回其值
{
	if(StackEmpty(*S))
	{
		return ERROR;//为空
	}
	*e = S->data[S->top];
	S->top--;
	return OK;
}
int StackLength(SqStack S)	//返回栈S的长度
{	
	return S.top+1;
}



你可能感兴趣的:(数据结构与算法之——顺序栈)