棧結構的陣列實現是用乙個一維陣列存放資料,資料每次從隊尾加入,刪除時也從隊尾刪除,要實現這種增刪操作需要使用乙個記錄下標的指標(top)來指向棧頂。當新增元素時新增到 arr[top+1]位置,當要做刪除操作時 使top–;指向倒數第二個元素,使其稱為新棧頂。舊棧頂則被忽略,當其所佔空間要使用時直接覆蓋即可。
棧是一種很常用的結構,比如函式呼叫就使用棧結構,當程式執行到函式調語句時先把當前函式儲存在棧中,即壓棧。然後進入函式呼叫執行。當再次碰到函式呼叫語句時則重複上述步驟。當乙個函式呼叫a執行完後,再把呼叫a的函式從棧中取出,繼續執行這條函式。如此重複,直到main函式執行結束。下面是遞迴演示
void recursiondemo(array *arr,int count)
push(arr,count);
printf(" %d 元素進棧\n",count);
//呼叫自身
recursiondemo(arr,++count);
//列印後 出棧
printf(" %d 元素出棧\n",*gettop(arr));
pop(arr);
列印結果
1 元素進棧
2 元素進棧
3 元素進棧
4 元素進棧
5 元素進棧
5 元素出棧
4 元素出棧
3 元素出棧
2 元素出棧
1 元素出棧
請按任意鍵繼續. . .
遞迴常用於分治法解決問題,每一次遞迴都使問題規模更小,直到問題規模最小(不可拆分)時結束遞迴。
#define size 6
//定義棧結構
typedef
struct
arrayarray;
//初始化
array *newarr()
//判棧空
int isempty(array *arr)
//出棧
void pop(array *arr)
arr->top--;
}//返回棧頂元素的指標
int *gettop(array *arr)
//入棧
void push(array *arr,int value)
}//test
void astest()
//現在是空棧了
printf("\n遞迴演示\n");
//棧的遞迴演示
recursiondemo(arr,1);
}void recursiondemo(array *arr,int count)
push(arr,count);
printf(" %d 元素進棧\n",count);
//呼叫自身
recursiondemo(arr,++count);
//列印後 出棧
printf(" %d 元素出棧\n",*gettop(arr));
pop(arr);}/*
執行結果:
value = 5 top = 5
value = 4 top = 4
value = 3 top = 3
value = 2 top = 2
value = 1 top = 1
遞迴演示
1 元素進棧
2 元素進棧
3 元素進棧
4 元素進棧
5 元素進棧
5 元素出棧
4 元素出棧
3 元素出棧
2 元素出棧
1 元素出棧
請按任意鍵繼續. . .
*/
線性表之陣列實現
因為線性表的順序儲存結構是一種隨機訪問的儲存結構,同時線性表的長度可變,且所需最大儲存空間隨問題不同而不同,則在c語言中,用動態分配的一維陣列來實現。下面是線性表的動態分配順序儲存結構 typedef struct sqlist 該程式採用選單和結構體陣列,這樣方便測試每個功能的實現。同時將類c 轉...
線性表之棧
一種只能在一端進行插入或刪除操作的線性表被稱為棧,其中允許刪除或插入的一端為棧頂,另一端為棧底,棧底固定不變 棧的特點 先進後出,例如彈夾,先裝的子彈最後才能出 按照儲存結構可以分為兩種棧 順序棧的結構體定義 typedef struct sqstack 鏈棧結構體定義 typedef struct...
資料結構棧 線性表實現
棧的定義 棧是一種特殊的表這種表只在表頭進行插入和刪除操作。因此,表頭對於棧來說具有特殊的意義,稱為棧頂。相應地,表尾稱為棧底。不含任何元素的棧稱為空棧。而本次給大家介紹用線性表實現的棧。如圖 這裡介紹雙向鍊錶的常用操作 l 建立棧 l 銷毀棧 l 清空棧 l 壓棧 l 出棧 l 返回棧頂元素 l ...