栈的特点:
栈是一个限定仅在表尾进行插入和删除操作的线性表;又称后进先出的线性表。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);
}
程序运行如下: