手動實現一個簡單支持動態增長的棧

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

typedef int DataType;

//支持動態增長的棧
typedef struct Stack
{
	DataType* _a;//數組
	size_t _top;
	size_t _capacity;//棧的容量
}Stack;

//棧的初始化
void StackInit(Stack* s);
//入棧
void StackPush(Stack* s, DataType x);
//出棧
void StackPop(Stack* s);
//返回棧頂數據
DataType StackTop(Stack* s);
//檢查棧是否爲空
int StackIsEmptyr(Stack* s);
//棧的銷燬
void StackDestroy(Stack* s);

//棧的初始化
void StackInit(Stack* s)
{
	assert(s);
	s->_a = NULL;
	s->_top = s->_capacity = 0;
}

//入棧
void StackPush(Stack* s, DataType x)
{
	assert(s);//判空
	if (s->_top == s->_capacity)//判斷是否需要擴容
	{
		size_t newcapacity = s->_capacity == 0 ? 4 : s->_capacity * 2;
		s->_a = (DataType*)malloc(sizeof(DataType) * newcapacity);
		s->_capacity = newcapacity;
	}
	//不需要擴容則給a[s->_top]賦值, 即進棧
	s->_a[s->_top] = x;
	++s->_top;
}

//出棧
void StackPop(Stack* s)
{
	assert(s);
	s->_top--;
}

//返回棧頂數據
DataType StackTop(Stack* s)
{
	return s->_a[s->_top - 1];
}

//檢查棧是否爲空
int StackIsEmptyr(Stack* s)
{
	return s->_top == 0 ? 1 : 0;
}

//棧的銷燬
void StackDestroy(Stack* s)
{
	assert(s);

	//釋放空間
	free(s->_a);
	s->_a = NULL;
	s->_capacity = s->_top = 0;
}

//自己實現棧的測試
void testStack()
{
	Stack st;
	StackInit(&st);

	StackPush(&st, 1);
	StackPush(&st, 2);
	printf("%d ", StackTop(&st));
	StackPop(&st);
	printf("%d ", StackTop(&st));
	StackPop(&st);
	StackPush(&st, 3);
	StackPush(&st, 4);

	while (!StackIsEmptyr(&st))
	{
		printf("%d ", StackTop(&st));
		StackPop(&st);
	}

	StackDestroy(&st);

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