數據結構學習(八)——順序棧的相關操做

堆棧是一種只容許在表的一端(稱爲棧頂)進行插入和刪除的線性表,而在表的另外一端(稱爲棧底)是不能進行操做的,也是線性表的一種特例。數組

堆棧的順序存儲是用數組來是實現的。爲了表示棧,咱們須要一個棧頂指針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");
}
相關文章
相關標籤/搜索