线性表之栈

栈的特点:

栈是一个限定仅在表尾进行插入和删除操作的线性表;又称后进先出的线性表。LIFO结构。

栈顶(top):允许操作 的一端;

栈底(bottom):不允许操作的一端。

空栈:不含任何数据元素的栈;top=-1;

栈的常见操作: 创建栈 销毁栈 清空栈 进栈 出栈 获取栈顶元素 获取栈的长度

注意事项:若存储栈的长度为StackSize,则栈顶位置top必须小于StackSize。  

                    若栈存在一个元素,top=0;   空栈的条件;top=-1。

下面就是一些对于栈操作的代码:

头文件:

#ifndef _SEQUENCESTACK_H_
#define _SEQUENCESTACK_H_

#include <stdlib.h>

#define SUCCESS 10000
#define FAILURE 10001
#define TRUE    10003
#define FALSE   10004

#define SIZE 10 //容量

typedef int ElemType;

struct stack
{
	int top;    //栈顶元素的位置
	ElemType *data;
	
};

typedef struct stack Stack;

int sequencestackinit(Stack **s); //栈初始化
int stackempty(Stack *s);         //判断栈是否为空
int push(Stack *s, ElemType e);   //进栈
int gettop(Stack *s);             //获取栈顶元素
int pop(Stack *s);                //出栈
int clearstack(Stack *s);         //清空栈
int destroystack(Stack **s);      //销毁栈

#endif

功能子函数:

#include "sequencestack.h"
#include <stdio.h>

int sequencestackinit(Stack **s)
{
	(*s) = (Stack *)malloc(sizeof(Stack));
	if(NULL == (*s))
		return FAILURE;
	(*s)->top = -1;
	(*s)->data = (ElemType *)malloc(sizeof(ElemType) * SIZE);
	if((*s)->data == NULL)
		return FAILURE;
	
	return SUCCESS;
	
}

int stackempty(Stack *s)
{
	return (s->top == -1) ? TRUE : FALSE;
}

int push(Stack *s, ElemType e)         //插入元素e为新的栈顶元素
{
	if(NULL == s || s->top == SIZE - 1)//入参判断,栈满
	{
		return FAILURE;
	}
	
	s->data[s->top + 1] = e;           //将新插入元素赋值给栈顶空间
	s->top++;                          //栈顶指针增加1
	
	return SUCCESS;
	
	
}

int gettop(Stack *s)
{
	if(s->top == -1)
	{
		return FAILURE;
	}
	
	return s->data[s->top];
}

int pop(Stack *s)      //若栈不为空,则删除s的栈顶元素,并返回success,否则返回failure
{
	if(s->top == -1)
		return FAILURE;
	s->top--;          //栈顶指针减一
	
	return SUCCESS;
}

int clearstack(Stack *s)
{
	if(NULL == s)
		return FAILURE;
	s->top = -1;
	
	return SUCCESS;
	
}

int destroystack(Stack **s)
{
	if(s == NULL || (*s) == NULL)
		return FAILURE;
	free((*s)->data);
	
	free(*s);
	(*s) = NULL;
	return SUCCESS;
}

测试主函数:

#include "sequencestack.h"
#include <stdio.h>

int main()
{
	Stack *stack;
	
	int ret, i;
	
	ret = sequencestackinit(&stack);
	if(SUCCESS == ret)
		printf("init success!\n");
	else
		printf("init failure!\n");
	
	ret = stackempty(stack);
	if(ret == TRUE)
		printf("stack is empty!\n");
	else if(ret ==FALSE)
		printf("stack is not empty!\n");
	
	for(i = 0; i < 10; i++)
	{
		ret = push(stack, i + 1);
		if(SUCCESS == ret)
			printf("push success! \n");
		else
			printf("push failure!\n");
	}
	
	ret = gettop(stack);
	if(FAILURE == ret)
		printf("get top failure!\n");
	else 
		printf("the top is %d\n", ret);
	
	for(i = 0; i < 5; i++)
	{
		ret = pop(stack);
		if(ret == FAILURE)
			printf("pop failure!\n");
		else
			printf("pop success!\n");
	}
	
	ret = clearstack(stack);
	if(FAILURE == ret)
		printf("clear failure!\n");
	else 
		printf("clear success!\n", ret);
	
	ret = destroystack(&stack);
	
	if(FAILURE == ret)
		printf("destroy failure!\n");
	else 
		printf("destroy success!\n", ret);
	
}

程序运行如下:

猜你喜欢

转载自blog.csdn.net/weixin_42720703/article/details/81460186