1. 程式人生 > >C語言_棧的基本操作(順序棧)

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;
}