大話數據結構之鏈棧

進棧操作

在這裏插入圖片描述

出棧操作

在這裏插入圖片描述

//03鏈棧_LinkStack
#include "stdio.h"    
#include "stdlib.h"   
#include "io.h"  
#include "math.h"  
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 存儲空間初始分配量 */

typedef int Status;
typedef int SElemType; /* SElemType類型根據實際情況而定,這裏假設爲int     */


/* 鏈棧結構 */
typedef struct StackNode
{
	SElemType data;
	struct StackNode *next;
}StackNode, *LinkStackPtr;


typedef struct
{
	LinkStackPtr top;
	int count;
}LinkStack;

Status visit(SElemType c)
{
	printf("%d ", c);
	return OK;
}

/*  構造一個空棧S */
Status InitStack(LinkStack *S)
{
	S->top = (LinkStackPtr)malloc(sizeof(StackNode));
	if (!S->top)
		return ERROR;
	S->top = NULL;
	S->count = 0;
	return OK;
}

/* 把S置爲空棧 */
Status ClearStack(LinkStack *S)
{
	LinkStackPtr p, q;
	p = S->top;
	while (p)
	{
		q = p;
		p = p->next;
		free(q);
	}
	S->count = 0;
	return OK;
}

/* 若棧S爲空棧,則返回TRUE,否則返回FALSE */
Status StackEmpty(LinkStack S)
{
	if (S.count == 0)
		return TRUE;
	else
		return FALSE;
}

/* 返回S的元素個數,即棧的長度 */
int StackLength(LinkStack S)
{
	return S.count;
}

/* 若棧不空,則用e返回S的棧頂元素,並返回OK;否則返回ERROR */
Status GetTop(LinkStack S, SElemType *e)
{
	if (S.top == NULL)
		return ERROR;
	else
		*e = S.top->data;
	return OK;
}

/* 插入元素e爲新的棧頂元素 */
Status Push(LinkStack *S, SElemType e)
{

	LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));
	s->data = e;
	s->next = S->top;	/* 把當前的棧頂元素賦值給新結點的直接後繼,見圖中① */
	S->top = s;         /* 將新的結點s賦值給棧頂指針,見圖中② */
	S->count++;
	return OK;
}

/* 若棧不空,則刪除S的棧頂元素,用e返回其值,並返回OK;否則返回ERROR */
Status Pop(LinkStack *S, SElemType *e)
{
	
	LinkStackPtr p;
	if (StackEmpty(*S))
		return ERROR;
	*e = S->top->data;
	p = S->top;					/* 將棧頂結點賦值給p,見圖中③ */
	S->top = S->top->next;    /* 使得棧頂指針下移一位,指向後一結點,見圖中④ */
	free(p);                    /* 釋放結點p */
	S->count--;



	return OK;
}

Status StackTraverse(LinkStack S)
{
	LinkStackPtr p;
	p = S.top;
	while (p)
	{
		visit(p->data);
		p = p->next;
	}
	printf("\n");
	return OK;
}

int main()
{
	int j;
	LinkStack s;
	int e;
	if (InitStack(&s) == OK)
		for (j = 1; j <= 10; j++)
			Push(&s, j);
	printf("棧中元素依次爲:");
	StackTraverse(s);
	Pop(&s, &e);
	printf("彈出的棧頂元素 e=%d\n", e);
	printf("棧空否:%d(1:空 0:否)\n", StackEmpty(s));
	GetTop(s, &e);
	printf("棧頂元素 e=%d 棧的長度爲%d\n", e, StackLength(s));
	ClearStack(&s);
	printf("清空棧後,棧空否:%d(1:空 0:否)\n", StackEmpty(s));
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章