1. 程式人生 > >考研資料結構與演算法之堆疊的建立與使用(一)

考研資料結構與演算法之堆疊的建立與使用(一)

    到了堆疊這裡一下子就輕鬆了,算是一種暫時的解脫吧。經過了連結串列部分的學習和思考,我突然意識到嚴蔚敏教材的嚴謹性。下面是按照教材實現的堆疊操作程式碼,唯一有些疑問的是在Pop操作中要不要根據需要縮減堆疊的尺寸呢?

#include <stdio.h>
#include <stdlib.h> 
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 100
#define STAK_INCREASEMENT 10
typedef int Status;
typedef int SElemType;
typedef struct
{
	SElemType *base;
	SElemType *top;
	int stacksize;
}SqStack;
Status InitStack(SqStack &S);
Status DestroyStack(SqStack &S);
Status ClearStack(SqStack &S);
Status StackEmpty(SqStack S);
int StackLength(SqStack S);
Status GetTop(SqStack &S, SElemType &e);
Status Push(SqStack &S, SElemType e);
Status Pop(SqStack &S, SElemType &e);
int main(void)
{
	SqStack S;
	InitStack(S);
	// Push(S,2);
	int i,j;
	for(i = 0; i<190; i++)
	{
		Push(S,i);
	}
	for(i=0; i<17; i++)
	{
		Pop(S,j);
		printf("%d\t",j);
	}
	system("pause");
}
Status InitStack(SqStack &S)
{
	S.base = (SElemType *)malloc( STACK_INIT_SIZE * sizeof(SElemType) );
	if(!S.base)
		return ERROR;
	S.top = S.base;
	S.stacksize = STACK_INIT_SIZE;
	return OK;
}
Status DestroyStack(SqStack &S)
{
	S.top = S.base;
	free(S.base);
	S.stacksize = 0;
	return OK;
}
Status ClearStack(SqStack &S)
{
	S.top = S.base;
	S.base = (SElemType *)realloc(S.base, STACK_INIT_SIZE * sizeof(SElemType) );
	S.stacksize = 100;
	return OK;
}
Status StackEmpty(SqStack S)
{
	if( S.base == S.top )
		return TRUE;
	return FALSE;
}
Status GetTop(SqStack &S, SElemType &e)
{
	if( S.base == S.top )
		return ERROR;
	e = *(S.top - 1);                // 這裡一定要注意
	return OK;
}
Status Push(SqStack &S, SElemType e)
{
	if( (S.top - S.base) >= S.stacksize )
	{
		S.base = (SElemType *)realloc(S.base, ( S.stacksize + STAK_INCREASEMENT ) * sizeof(SElemType));
		S.stacksize += STAK_INCREASEMENT;
		if(!S.base)
			return ERROR;
	}
	*S.top = e;
	S.top++;
	return OK;
}
Status Pop(SqStack &S, SElemType &e)
{
	if(S.base == S.top)
		return ERROR;
	S.top--;
	e = *S.top;
	return OK;
}

感謝下方留言的朋友指出我的錯誤。

相關推薦

考研資料結構演算法堆疊的使用連結串列實現的堆疊

還是參考了別人的程式碼,不過比我自己寫出來的確實是要簡潔的多,不過仍然有不規範的地方,但是仍然值得我學習一下,在敲打的時候也是受到了一定的啟發。 #include <stdio.h> #include <stdlib.h> #define FULL

考研資料結構演算法堆疊的使用利用堆疊匹配括號

    具體實現方法如下: int main(void) {     SqStack S;     InitStack(S);     char str[255];     scanf("%s",str);     int i = 0;     while( str[i]

考研資料結構演算法堆疊的使用利用堆疊實現進位制轉換

    將十進位制的數字轉換成各種不同的進位制,這裡以八進位制為例,其實就是不斷的除以八然後取餘數,雖然用陣列也不難實現,但是顯然棧的後進先出的特性使得更容易理解了,具體實現方法如下: int main(void) { SqStack S; InitStack(S);

考研資料結構演算法樹的生成1

只寫了個開頭中的開頭,因為書上的內容開始有點複雜了,尤其是引用了堆疊,這樣不利於專一的對樹進行學習,因此我在思考一種最合理的方案來對他進行簡化,現在只是對結構體進行了定義,如下: #include <stdio.h> #include <stdlib.h

資料結構演算法連結串列篇

連結串列作為一種基礎的資料結構之一,我們會常常使用到它,接下來就讓我們一起學習吧。 1、連結串列的經典應用場景: LRU快取淘汰演算法。 2、快取是一種提高資料讀取效能的技術,在硬體設計、軟體開發中都有著非常廣泛的應用,比如常見的CPU快取、資料庫快取、瀏覽器快取等等。

資料結構演算法連結串列篇

Q:如何輕鬆寫出正確的連結串列程式碼? 總結起來,就是投入時間+技巧; 一、投入時間:          只要願意投入時間,大多數人都是可以學會的,比如說,如果你真能花上一個週末或者一整天時間,就去寫連結

資料探勘演算法聚類分析canopy演算法

canopy是聚類演算法的一種實現 它是一種快速,簡單,但是不太準確的聚類演算法 canopy通過兩個人為確定的閾值t1,t2來對資料進行計算,可以達到將一堆混亂的資料分類成有一定規則的n個數據堆 由於canopy演算法本身的目的只是將混亂的資料劃分成大概的幾個類別,所以它

資料探勘演算法關聯規則挖掘FPGrowth演算法

之前介紹的apriori演算法中因為存在許多的缺陷,例如進行大量的全表掃描和計算量巨大的自然連線,所以現在幾乎已經不再使用 在mahout的演算法庫中使用的是PFP演算法,該演算法是FPGrowth演算法的分散式執行方式,其內部的演算法結構和FPGrowth演算法相差並不是

資料結構內排序慘死攻略

接上回合《資料結構內排序之慘死攻略(一)》 聽聞今天還要學資料結構,心中堵著一片烏雲。 就算受低潮情緒影響也要堅持學下去啊。 目錄 5 歸併排序 5.1 栗子 5.2 程式碼實現 5.3 歸併演算法優化 5.3.1 R.Sedgewick優化 5.3.2

資料結構演算法的總結和思考--堆排序

本篇分享的內容為堆排序,提到堆排序就不得不提一下堆這個資料結構。 堆實際上是一棵完全二叉樹,因此其任何一非葉節點滿足性質: Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key

java入門---資料結構操作例項在連結串列LinkedList的開頭和結尾新增元素

    以下例項演示瞭如何使用 LinkedList 類的 addFirst() 和 addLast() 方法在連結串列的開頭和結尾新增元素:import java.util.LinkedList; p

資料結構集合篇一些常用的資料結構和集合 面試常問部分

java有8種之多,但是不用害怕事實上常用的資料結構也就那麼幾種, 常用的也就是雜湊表,向量,Properties,集合框架,棧(關於資料結構,我寫的不是很細,因為最近小編在準備求職,等小編有空會準備詳細程式碼來進行講解) 棧 在面試中棧經常與佇列一起出題。 棧/佇列 線

【重點,要考的】資料結構演算法基礎--雜湊圖HashMap

HashMap可以說是java中最常見的幾種集合了。 在瞭解HashMap前我們要先了解Object的兩個方法:Equals和h

漢諾塔--Python的資料結構--無聊時候打發自己的時間

這個遊戲 的規則很簡單。 對於這個遊戲來說最重要的有倆點:1、對於K個(K大於等於1)盤子最少需要多少次搬運,這裡有個關係式,可以用第一數學歸納法證明,自行證明;2、對於確定的次數,每次我們進行的操作具體是怎樣的,或者說給一個具體的操作指南,讓機器知道每次要幹什麼。在這裡我要討論的是第二點。

lucene排序演算法向量空間模型

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

考研資料結構演算法堆疊建立使用

    到了堆疊這裡一下子就輕鬆了,算是一種暫時的解脫吧。經過了連結串列部分的學習和思考,我突然意識到嚴蔚敏教材的嚴謹性。下面是按照教材實現的堆疊操作程式碼,唯一有些疑問的是在Pop操作中要不要根據需要縮減堆疊的尺寸呢? #include <stdio.h>

java資料結構演算法順序表連結串列深入分析

關聯文章:   資料結構與演算法這門學科雖然在大學期間就已學習過了,但是到現在確實也忘了不少,因此最近又重新看了本書-《資料結構與演算法分析》加上之前看的《java資料結構》也算是對資料結構的進一步深入學習了,於是也就打算寫一系列的資料結構的博文以便加

資料結構演算法深度搜索理論+程式碼

一,圖的簡介       圖是一種與樹有些相似的資料結構,實際上在數學理論中,樹是圖的一種形式,但在計算機程式中,圖的應用方式與樹不一樣。圖通常有固定的形狀,這形狀由物理或抽象的問題所決定的,如圖,節點表示城市,邊為公路,可以將此現實生活中的地圖抽象為圖b,當討論圖時,節點

JavaScript 資料結構演算法美 - 線性表陣列、棧、佇列、連結串列

前言 基礎知識就像是一座大樓的地基,它決定了我們的技術高度。 我們應該多掌握一些可移值的技術或者再過十幾年應該都不會過時的技術,資料結構與演算法就是其中之一。 棧、佇列、連結串列、堆 是資料結構與演算法中的基礎知識,是程式設計師的地基。 筆者寫的 JavaScript 資料結構與演算法之美 系列用

資料結構演算法陣列奇數、偶數分離

        今日,博主在面試一家外企的時候,要求白板寫程式。其中就有一道演算法設計題目,下面就來分享一下這道題的演算法思路和相關示例程式碼。         題目:要求將一個整形陣列中的奇數和偶數進行分離,偶數在