小螞蟻學習數據結構(5)——線性結構——棧的操做演示

複習以前的內容c++

鏈表複習:算法

    數據結構:數組

        狹義:數據結構

            數據結構是專門研究數據存儲的問題。函數

            數據的存儲包含兩方面,個體的存儲,個體之間關係的存儲。學習

        廣義:spa

            數據結構既包含數據的存儲也包含數據的操做.net

            對存儲數據的操做就是算法指針

算法:code

    狹義的算法是與數據的存儲方式密切相關

    廣義的算法是與數據的存儲方式無關

    這就是泛型的思想

    如何實現:1,經過模板;2,運算符的重載;3,經過指針 //這裏須要去學習c++,否則很難理解

    泛型:

        利用某種技術達到的效果就是:不一樣的存儲方式,執行的操做是同樣的

數據的存儲結構有幾種

    1,線性

            連續存儲(數組)

                優勢:存取的速度很快

                缺點:插入刪除元素就很慢了

                    實現必須知道數組的長度

                    插入刪除元素很慢

                    空間一般是有限制的

                    須要大塊連續的內存塊

            離散存儲(鏈表)

                優勢:空間沒有限制,只要內存夠用

                            插入刪除元素的速度很快,無需移動其餘元素

                缺點:存取速度慢

            線性結構的應用 1 棧 2,隊列

    2,非線性

            樹

            圖

    到了今天的主題,棧的操做,跟鏈表仍是很是類似的,只是棧將鏈表的有些功能給限制了。

/*
	棧的操做
*/
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>

//節點結構體
typedef struct Node
{
	int data;
	struct Node * pNext;
}NODE,*PNODE;

//棧結構體
typedef struct Stack
{
	PNODE pTop;
	PNODE pBottom;
}STACT,*PSTACT; 

//函數前置聲明
void init(PSTACT);	//建立一個棧
void push(PSTACT, int);	//向棧中壓入一個元素
void traverse(PSTACT);	//遍歷這個棧
bool pop(PSTACT,int *);	//從棧中彈出一個元素
bool clear(PSTACT);	//清空這個棧

int main(void)
{
	int val; //保存彈出的數據
	
	//建立一個棧
	STACT S;
	
	//初始化這個棧
	init(&S);
	
	//推入一個元素
	printf("壓入一個元素1\n");
	push(&S,1);
	printf("壓入一個元素2\n");
	push(&S,2);
	printf("壓入一個元素3\n");
	push(&S,3);
	printf("壓入一個元素4\n");
	push(&S,4);
	
	printf("遍歷這個棧:");
	traverse(&S);
	
	printf("彈出一個元素:");
	pop(&S, &val);
	traverse(&S);
	
	printf("再彈出一個元素:");
	pop(&S, &val);
	traverse(&S);
	
	printf("將整個棧清空以後\n");
	clear(&S);
	
	printf("遍歷這個棧:");
	traverse(&S);
	
	return 0;
}

/*
	初始化這個棧
	@param PSTACT	pst	棧的指針
	return void
*/
void init(PSTACT pst)
{
	PNODE p = (PNODE)malloc(sizeof(NODE));
	if( NULL == p )
	{
		printf("動態內存常見失敗\n");
		exit(-1);
	}
	pst->pBottom = p;
	pst->pTop = pst->pBottom;
	p->pNext = NULL;
	
	return;
}

/*
	往棧中推入一個元素
	@param PSTACT	pst	棧的指針
	@param int 		val 要推入元素的值
	return void
*/
void push(PSTACT pst,int val)
{
	PNODE p = (PNODE)malloc(sizeof(NODE));
	if( NULL == p )
	{
		printf("動態內存常見失敗\n");
		exit(-1);
	}
	p -> data = val;
	p -> pNext = pst -> pTop;
	pst -> pTop = p;
	
	return;
}

/*
	判斷棧是否爲空
	@param PSTACT	pst	棧的指針
	return Boolean
*/
bool is_empty(PSTACT pst)
{
	if( pst->pBottom == pst->pTop )
	{
		return true;
	}
	else
	{
		return false;
	}
}

/*
	遍歷這個棧
	@param PSTACT	pst	棧的指針
	return void
*/
void traverse(PSTACT pst)
{
	if( is_empty(pst) )
	{
		printf("棧爲空!\n");
		exit(-1);
	}
	PNODE p = pst -> pTop;
	
	while( p != pst -> pBottom )
	{
		printf("%d ",p -> data);
		p = p -> pNext;
	}
	printf("\n");
	
	return;
}

/*
	從棧中彈出一個元素
	@param PSTACT	pst	棧的指針
	@param int *	val 彈出元素的值
	return Boolean
*/
bool pop(PSTACT pst , int * val)
{
	if( is_empty(pst) )
	{
		printf("棧爲空!\n");
		return false;
	}
	PNODE p = pst -> pTop;
	*val = p -> data;
	pst -> pTop = p -> pNext;
	
	free(p);
	p = NULL;
	
	return true;
	
}

/*
	清空這個棧
	@param PSTACT	pst	棧的指針
	return Boolean
*/
bool clear(PSTACT pst)
{
	PNODE q;
	
	if( is_empty(pst) )
	{
		printf("棧爲空\n");
		return false;
	}
		
	while(pst -> pTop != pst -> pBottom)
	{
		q = pst -> pTop -> pNext;
		free(pst -> pTop);
		pst -> pTop = q;
		
	}
	
	return true;
}
/*
	VC++6.0 輸出的結果是:
	======================================
	壓入一個元素1
	壓入一個元素2
	壓入一個元素3
	壓入一個元素4
	遍歷這個棧:4 3 2 1
	彈出一個元素:3 2 1
	再彈出一個元素:2 1
	將整個棧清空以後
	遍歷這個棧:棧爲空!
	======================================
	總結:
		棧也就是一個鏈表,「先進後出」不能從中間插入或刪除
		鏈表能夠從頭指針找到鏈表的頭部
		棧使用棧頂指針對鏈表進行操做
*/


學PHP的小螞蟻 博客 http://my.oschina.net/woshixiaomayi/blog

相關文章
相關標籤/搜索