數據結構C語言 棧的實現

棧是一種特殊的線性表,刪除和插入操作受限,遵循後進先出First in last out的原則(就像網球筒一樣,先進後出)。習慣上,我們稱表頭端(先進的部分)爲棧底bottom or base,表尾端爲棧頂top,插入和刪除都在棧頂top進行。在棧頂插入元素我們叫做push,在棧頂刪去元素我們叫做pop。作爲線性表,當然棧也分爲順序棧和鏈棧。我們還是分開進行說明。

我們先來康康順序棧的表示和實現:

情景:設想若干年後,幼兒園裏,老師正在給某個父母都是程序員的小男孩聽寫大小寫的alphabet,老師唸了:“大寫的A 小寫的k 大寫的M 大寫的N...”共十幾個字母,小朋友需要在聽寫結束的時候,把老師聽寫的字母按順序倒着念出來,由於小朋友感冒了,不想說話,於是想寫代碼把這些字母一一呈現在屏幕上。

先意思一下,夜已深了,我該上牀了。

#include "stdafx.h"
#include <stdio.h>
#define MAXSIZE 100
//爲了傳承嚴蔚敏教材的風格,我們還是設置一個Status返回值
typedef int Status;
#define OK 1
#define ERROR 0
#define OVERFLOW -2 
//基本數據結構棧的定義 
typedef struct
{
	char *base;
	char *top;
	int stacksize;   //記錄棧的容量 
}SqStack;
//順序棧的初始化 
Status InitStack(SqStack &S)
{
	S.base = new char[MAXSIZE]; 		//哼哼,反正現在內存也不值錢
	if (!S.base) 
		return ERROR;	   //存儲分配失敗 
	S.top = S.base;				//最開始的時候,top和base指向同一個單元 
	S.stacksize = MAXSIZE;       //作爲判滿的標誌 
	return OK;
}
//入棧push ,把新元素e插入作爲棧頂元素 
Status Push(SqStack &S, char &e)  //這是引用的方式,這個在我前面的水文中有提到過。
{
	if (S.top - S.base == S.stacksize) return ERROR;//棧滿了,爆棧工程師瞭解一下?指針作差是返回相應的單元的個數 
	*S.top = e;	//注意top指針永遠是在實際棧頂 上方元素 的下標地址 
	S.top++; 		//如果你比較炫技,可以寫成*S.top++ =e; 
	return OK;
}

//出棧,雖然在這個情境下用不到的
Status Pop(SqStack &S, char &e)
{
	if (S.top == S.base) return ERROR; //棧空了,甚至沒有元素可以出棧
	e = *--S.top; //炫技瞭解一下?
	return OK;
}

//取出棧頂元素,印出老師聽寫的最後一個字母 
char GetTop(SqStack &S)
{
	if (S.top != S.base);//非空
	return *(S.top - 1);     //重中之重,一定要區分,是否你的這行代碼修改了棧頂指針,此時top指針並未修改 
}
#include <stdio.h>
int main(void)
{
	SqStack S;
	InitStack(S);
	char Tingxie;
	scanf("%c", &Tingxie);
	Push(S,Tingxie);
	printf("%c\n",GetTop(S));


}

——————————————————————————————————————————————大家改天見!

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