C语言_栈的基本操作(顺序栈)

##本片博客主要是顺序栈的基本操作,包含以下内容:

初始化
入栈
出栈
判空
判满
返回栈顶元素(栈顶元素不出栈)
返回栈顶元素(栈顶元素出栈)

###顺序栈的初始化:
初始化顺序栈时只需要让栈顶等零

void InitStack (Stack *p)	//初始化
{
	assert (p != NULL);
	p->top = 0;
}

###入栈
入栈时,将元素的值赋在top的位置,在让top++

void PushStack (Stack *p, DataType d)	//入栈
{
	assert (p);
	if (p->top == MAXSIZE)
	{
		printf ("栈满,无法入栈!!!\n");
		return;
	}
	p->data[p->top++] = d;
}

###出栈:
出栈时只需要将top-1

void PopStack (Stack *p)//出栈
{
	assert (p);
	if (p->top == 0)
	{
		printf ("栈空,操作失败!!!\n");
		return;
	}
	p->top --;
}

###返回栈顶元素(栈顶元素不出栈):
返回栈顶元素,top的值不变

DataType TopNum (Stack *p)	 //返回栈顶元素(不出栈)
{
	if (p->top == 0)
	{
		printf ("栈为空!!\n");
		return 0;
	}
	return p->data[(p->top)-1];
}

###返回栈顶元素(栈顶元素出栈):
返回top的值之后让top-1

DataType TopNumAndTop (Stack *p)	 //返回栈顶元素(出栈)
{
	if (p->top == 0)
	{
		printf ("栈为空!!\n");
		return 0;
	}
	return p->data[--(p->top)];
}

###判断栈是否为空(为空,返回1;如果不为空,返回0):

int IsEmpty (Stack *p)	// 判空
{
	return (p->top == 0);//如果为空,返回1;如果不为空,返回0
}

###判断栈是否已满(满了返回1,未满返回0)

int IsFull (Stack *p)	//判满
{
	return (p->top == MAXSIZE);//如果栈满 返回1;否则返回0
}

这里是对应的头文件statck.h:

# ifndef __stack_h__
# define __stack_h__

#include <assert.h>
#include <stdio.h>

#define MAXSIZE 30

//typedef char DataType ;
typedef int DataType ;

typedef struct STACK
{
	int top ;	//栈顶
	DataType data[MAXSIZE];	//数据
}Stack;

void InitStack (Stack *p);	//初始化

void PushStack (Stack *p, DataType d);	//入栈

void PopStack (Stack *p);	// 出栈

int IsEmpty (Stack *p);	// 判空

int IsFull (Stack *p);	//判满

DataType TopNum (Stack *p);	 //返回栈顶元素(不出栈)

DataType TopNumAndTop (Stack *p);	 //返回栈顶元素然后出栈


# endif

功能测试:

#include "statck.h"

void test1()
{
	int ret = -1;
	Stack stack;
	InitStack (&stack);
	
	ret = IsEmpty (&stack);
	if (ret)
		printf ("栈为空\n");
	else
		printf ("栈不为空\n");


	ret = IsFull (&stack);
	if (ret)
		printf ("栈满\n");
	else
		printf ("栈不满\n");


	//入栈
	PushStack(&stack, 1);
	PushStack(&stack, 2);
	PushStack(&stack, 3);
	PushStack(&stack, 4);

	ret = IsEmpty (&stack);
	if (ret)
		printf ("栈为空\n");
	else
		printf ("栈不为空\n");


	ret = IsFull (&stack);
	if (ret)
		printf ("栈满\n");
	else
		printf ("栈不满\n");

	//出栈
	PopStack (&stack);
	PopStack (&stack);

	ret = IsEmpty (&stack);
	if (ret)
		printf ("栈为空\n");
	else
		printf ("栈不为空\n");


	ret = IsFull (&stack);
	if (ret)
		printf ("栈满\n");
	else
		printf ("栈不满\n");

	PopStack (&stack);
	PopStack (&stack);

	ret = IsEmpty (&stack);
	if (ret)
		printf ("栈为空\n");
	else
		printf ("栈不为空\n");


	ret = IsFull (&stack);
	if (ret)
		printf ("栈满\n");
	else
		printf ("栈不满\n");

}

void test2()
{
	DataType ret = -1;
	Stack stack;
	InitStack (&stack);

	ret = TopNum (&stack);
	printf ("%d\n", ret);

	//入栈
	PushStack(&stack, 1);
	PushStack(&stack, 2);
	PushStack(&stack, 3);
	PushStack(&stack, 4);
	ret = TopNum (&stack);
	printf ("%d\n", ret);
}
void test3()
{
	DataType ret = -1;
	Stack stack;
	InitStack (&stack);

	ret = TopNumAndTop (&stack);
	printf ("%d\n", ret);

	//入栈
	PushStack(&stack, 'a');
	PushStack(&stack, 'b');
	PushStack(&stack, '4');
	PushStack(&stack, 'd');
	ret = TopNumAndTop (&stack);
	printf ("%c\n", ret);
}
int main ()
{
//	test1();
//	test2();
	test3();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/A__B__C__/article/details/82701152