棧:一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行數據插入刪除操作的一端稱爲棧頂,另一端稱爲棧底。不含任何元素的棧稱爲空棧

棧最大的特點就是:先進後出,後進先出

棧可分爲順序棧和鏈式棧

1)順序棧所有的操作時間複雜度都是O(1)

2)鏈式棧就不一定了得看你的棧頂位於鏈表的頭還是尾(一般建議將棧頂設計在鏈表頭的位置,這樣入棧出棧操作都是O(1)。否則入棧是O(1)出棧是O(N)。可以思考一下原因 --> 因爲你刪除掉鏈表的最後一個元素,可是他的前一個元素你得遍歷整個鏈表才能得知,進而才能重新確定棧頂位置)

在此我實現順序棧(操作相對都簡單些^0^)

#define MAX (100)
typedef char SDataType;

typedef struct stack
{
	//定義一個數組存放數據
	SDataType array[MAX];
	//表示棧內有效元素的個數,也表示此時棧頂位置的下標
	int top;
}stack;

我的棧中實現了以下的基本操作

//棧的初始化
void stackInit(stack *ps);

//入棧操作
void stackPush(stack *ps, SDataType data);

//出棧操作
void stackPop(stack *ps);

//求得棧頂元素
SDataType stackTop(stack *ps);

//判斷是否爲空棧
int stackIsEmpty(stack *ps);

//求得棧的大小(含數據的個數)
int stackSize(stack *ps);

//將棧進行拷貝
void stackCopy(stack *psDest, stack *psSrc);

1)初始化

void stackInit(stack *ps)
{
	assert(ps != NULL);
	ps->top = 0;
}

2)入棧

void stackPush(stack *ps, SDataType data)
{
	assert(ps != NULL);
	assert(ps->top < MAX);
	ps->array[ps->top] = data;
	ps->top++;
}

3)出棧

void stackPop(stack *ps)
{
	assert(ps != NULL);
	assert(ps->top > 0);
	ps->top--;
}

4)棧頂元素

SDataType stackTop(stack *ps)
{
	assert(ps != NULL);
	assert(ps->top > 0);
	return ps->array[ps->top - 1];
}

5)是否爲空棧

//空棧返回1,否則返回0
int stackIsEmpty(stack *ps)
{
	assert(ps != NULL);
	if (ps->top == 0){
		return 1;
	}
	else{
		return 0;
	}
}

6)棧大小

int stackSize(stack *ps)
{
	assert(ps != NULL);
	return ps->top;
}

7)棧拷貝

void stackCopy(stack *psDest, stack *psSrc)
{
	assert(psDest != NULL);
	assert(psSrc != NULL);
	psDest->top = psSrc->top;
	memcpy(psDest->array, psSrc->array, sizeof(SDataType)* psSrc->top);
}

總結:瞭解了之前順序表博客的內容後,相信對棧的操作就更容易了。因爲棧只能在一端進行操作

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