18.8.6 记录 :顺序栈的创建以及基本操作。

******************************************************************************************************************

栈的特点:先进后出。
#
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;
}

猜你喜欢

转载自blog.csdn.net/qq_41481342/article/details/81459893