1. 程式人生 > 實用技巧 >棧 - 陣列C語言

棧 - 陣列C語言

// 順序棧
#include <stdlib.h>
#include <stdio.h>

#define STATUS_TRUE 1
#define STATUS_FALSE 0
#define MAXSIZE 100

typedef int SElemType;
/*
 * ADT - 棧的基本抽象資料型別:
 *		InitStack(*S)
 *		DestroyStack(*S)
 *		ClearStack(*S)
 *		StackEmpty(S)
 *		StackFull(S)
 *		Top(*S)
 *		Push(*S)
 *		Pop(*S)
 *		StackLength(S)
 */

 // 順序棧基本資料結構
typedef struct {
	SElemType data[MAXSIZE];
	int top;
}Stack;


/*  構造一個空棧S */
void Initial(Stack* stack)
{
	stack->top = -1;
}

void Destroy(Stack* stack) {}

/* 把S置為空棧 */
void Clear(Stack* stack)
{
	stack->top = -1;
}

/* 空棧判定 */
int Empty(Stack stack)
{
	return stack.top == -1;
}

/* 滿棧判定 */
int Full(Stack stack)
{
	return stack.top == MAXSIZE - 1;
}

/* 棧長 */
int Length(Stack stack)
{
	//printf("stack length:%d\n", stack.top + 1);
	return stack.top + 1;								// 注意:stack.top + 1與stack.top++在這裡大有區別
}

/* 入棧 */
int Push(Stack *stack, SElemType e)
{
	if (Full(*stack))
	{
		return 0;
	} 
	else
	{
		stack->data[++stack->top] = e;
		return 1;
	}
	
}

/* 出棧 */
int Pop(Stack* stack, SElemType *e)
{
	if (Empty(*stack))
	{
		return 0;
	}
	else
	{
		*e = stack->data[stack->top--];
		return 1;
	}
}

/* 獲取棧頂元素 */
int Top(Stack* stack, SElemType* e)
{
	if (Empty(*stack))
	{
		return 0;
	}
	else
	{
		*e = stack->data[stack->top];
		return 1;
	}
}

void Traverse(Stack stack)
{
	
	for (int i = 0; i < Length(stack); i++)
	{
		printf("stack element %d value:%d\n", i, stack.data[i]);
	}
}

int main()
{
	Stack stack;
	SElemType e;
	Initial(&stack);
	
	Push(&stack, 1);
	Push(&stack, 2);
	Push(&stack, 3);
	Push(&stack, 4);
	Push(&stack, 5);
	Traverse(stack);
	printf("=======================\n");
	Pop(&stack, &e);
	Traverse(stack);
	printf("Pop up elemnt:%d\n", e);
	printf("=======================\n");
	Top(&stack, &e);
	Traverse(stack);
	printf("Get top elemnt:%d\n", e);
}