数据结构学习(八)——顺序栈的相关操做

堆栈是一种只容许在表的一端(称为栈顶)进行插入和删除的线性表,而在表的另外一端(称为栈底)是不能进行操做的,也是线性表的一种特例。数组

堆栈的顺序存储是用数组来是实现的。为了表示栈,咱们须要一个栈顶指针top来指示栈顶位置。下面的代码实现了对顺序栈的相关操做。指针

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 100

typedef struct
{
	int data[MAXSIZE];
	int top;			//栈顶指针
}sqstack;

sqstack *Sqstack_Create();				//建立堆栈
int Sqstack_GetTop(sqstack *q);			//取得栈顶
int Sqstack_In(sqstack *q, int dat);	//入栈
int Sqstack_Out(sqstack *q);			//出栈
void Sqstack_SetNull(sqstack *q);		//栈置空
int Sqstack_Empty(sqstack *q);			//判断栈是否空
void ShowSqstack(sqstack *q);			//输出显示堆栈

int main(atevoid)
{
	sqstack *q;
	int choice;
	int ans, dat;

	printf("顺序栈操做练习:\n");
	q = Sqstack_Create();
	while(1)
	{
		printf("顺序栈相关操做:\n");
		printf("1.取栈顶结点\n");
		printf("2.入栈\n");
		printf("3.出栈\n");
		printf("4.输出显示栈\n");
		printf("5.退出程序\n");
		printf("作出选择:");
		scanf("%d", &choice);

		switch(choice)
		{
		case 1:
			ans = Sqstack_GetTop(q);
			if(ans == -1)
				printf("取栈顶结点失败!\n");
			else
				printf("栈顶结点为%d\n", ans);
			break;
		case 2:
			printf("输入你想入栈的数据:");
			scanf("%d",&dat);
			ans = Sqstack_In(q, dat);
			if(!ans)
				printf("入栈失败\n");
			else
				printf("入栈成功\n");
			break;
		case 3:
			ans = Sqstack_Out(q);
			if(ans == -1)
				printf("出栈失败!\n");
			else
				printf("出栈成功!\n");
			break;
		case 4:
			ShowSqstack(q);
			break;
		case 5:
			return 0;
			break;
		default:
			printf("选择无效!\n");
			break;
		}
	}
	return 1;
}

//置空栈
void Sqstack_SetNull(sqstack *q)
{
	q->top = -1;		//空栈时栈顶指针为-1
}

//判断堆栈是否空
int Sqstack_Empty(sqstack *q)
{
	if(q->top == -1)	//堆栈栈顶为-1则为空
		return 1;
	else
		return 0;
}

//堆栈建立
sqstack *Sqstack_Create()
{
	sqstack *q;
	int num, i;

	q = (sqstack*)malloc(sizeof(sqstack));
	Sqstack_SetNull(q);
	printf("输入想建立堆栈数据的个数:");
	scanf("%d", &num);
	if(num>MAXSIZE-1)
		return NULL;
	printf("依次输入堆栈的数据:");
	for(i=0;i<num;i++)
	{
		scanf("%d", &q->data[i]);
		q->top++;
	}
	return q;
}

//取得栈顶
int Sqstack_GetTop(sqstack *q)
{
	if(Sqstack_Empty(q))		//先要判断是否为空栈
		return -1;
	else
		return q->data[q->top];
}

//入栈
int Sqstack_In(sqstack *q, int dat)
{
	if(q->top == MAXSIZE-1)		//先要判断堆栈是否已满
		return 0;
	else
	{
		q->top += 1;
		q->data[q->top] = dat;
		return 1;
	}
}

//出栈
int Sqstack_Out(sqstack *q)
{
	if(Sqstack_Empty(q))		//先要判断堆栈是否为空
		return -1;
	else
		return q->data[q->top--];
}

//输出显示堆栈
void ShowSqstack(sqstack *q)
{
	int i;

	for(i=0; i<=q->top; i++)
	{
		printf("%d ", q->data[i]);
	}
	printf("\n");
}
相关文章
相关标签/搜索