******************************************************************************************************************
栈的特点:先进后出。
#
1.栈是一个特殊的线性表,只能在一段操作
2.允许操作的一段称为栈顶,栈底是不可以被操作的。
#
常见操作:
创建栈,销毁栈,清空栈,进栈,出栈,获取栈顶元素,获取栈长度。
#
顺序栈:连续存储的栈。
链栈:不连续存储的栈。
#
栈顶指针:是一个下标。(如果有一个元素,为0,空栈为-1)栈的长度可以用栈顶指针最大值-1来表示。
栈的起始地址:(栈底元素的位置)
头文件:
#ifndef _SequenceStack_h
#define _SequenceStack_h
#define SIZE 10
#define SUCCESS 9999
#define FAILURE 9998
#define TRUE 9997
#define FALSE 9996
typedef int ElemType;
struct stack
{
int top;
ElemType *data;
};
typedef struct stack Stack;
int StackInit(Stack **s);
int StackEmpty(Stack *s);
int Push(Stack *s,ElemType e);
int GetTopElem(Stack* s);
int POP(Stack* s);
int StackClear(Stack* s);
int StackDestory(Stack** s);
#endif
自定义函数:
#include<stdio.h>
#include"SequenceStack.h"
#include<stdlib.h>
int StackInit(Stack **s)
{
(*s) = (Stack*)malloc(sizeof(Stack) * 1);
if( NULL == *s )
{
return FAILURE;
}
(*s)->top = -1;
(*s)->data = (ElemType*)malloc(sizeof(ElemType) * SIZE);
if( NULL == (*s)->data )
{
return FAILURE;
}
return SUCCESS;
}
int StackEmpty(Stack* s)
{
int ret;
ret = ( s->top == -1)?TRUE:FALSE;
return ret;
}
int Push(Stack *s,ElemType e)
{
if( NULL == s && s->top == 9)
{
return FAILURE;
}
s->data[s->top + 1] = e;
s->top++;
return SUCCESS;
}
int GetTopElem(Stack* s)
{
if ( -1 == s->top || NULL == s)
{
return FAILURE;
}
return s->data[s->top];
}
int POP(Stack* s)
{
if( NULL == s)
{
return FAILURE;
}
s->top--;
return SUCCESS;
}
int StackClear(Stack* s)
{
if( NULL == s )
{
return FAILURE;
}
s->top = -1;
return SUCCESS;
}
int StackDestory(Stack** s)
{
if( NULL == s || *s == NULL )
{
return FAILURE;
}
free( (*s)->data );
free( *s);
*s = NULL ;
return SUCCESS;
}
主函数:
#include<stdio.h>
#include"SequenceStack.h"
#include<stdlib.h>
int main()
{
Stack *stack; //指向栈的信息的指针
int ret;
int i;
ret = StackInit(&stack); //stack是一个野指针
if( SUCCESS == ret )
{
printf("init success!\n");
}
if( FAILURE == ret )
{
printf("init failure!\n");
}
ret = StackEmpty(stack);
if( TRUE == ret )
{
printf("stack is not empty!\n");
}
else if( FALSE == ret )
{
printf("stack is empty!\n");
}
for(i = 0; i < SIZE ; i++)
{
ret = Push(stack,i+1);
if( FAILURE == ret )
{
printf("the number:%d been pushed failure!\n",i+1);
}
else if ( SUCCESS == ret )
{
printf("the number:%d been pushed success!\n",i+1);
}
}
ret = GetTopElem(stack);
if( FAILURE == ret )
{
printf("get elem failure!\n");
}
else
{
printf("the top elem of stack is:%d\n",ret);
}
for(i = 0 ;i < SIZE/2;i++)
{
ret = POP(stack);
if( FAILURE == ret )
{
printf("out failure!\n");
}
if( SUCCESS == ret )
{
printf("out success!\n");
}
}
ret = GetTopElem(stack);
if( FAILURE == ret )
{
printf("get elem failure!\n");
}
else
{
printf("the top elem of stack is:%d\n",ret);
}
ret = StackClear(stack);
if( FAILURE == ret )
{
printf("clear failure!\n");
}
if( SUCCESS == ret )
{
printf("clear success!\n");
}
ret = StackDestory(&stack);
if( FAILURE == ret )
{
printf("destory failure!\n");
}
else if( SUCCESS == ret )
{
printf("destory success!\n");
}
return 0;
}