棧(stack)又名堆疊,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。
棧只能在棧頂進行操作
鏈式棧的棧頂是第乙個資料結點
特點:先進後出
鏈式棧是一種資料儲存結構,可以通過單鏈表的方式來實現,使用鏈式棧的優點在於它能夠克服用陣列實現的順序棧空間利用率不高的特點,但是需要為每個棧元素分配額外的指標空間用來存放指標域。
先介紹下出入棧的過程:
入棧:出棧:
以下為全部**:
liststack.h
#pragma once
typedef struct snode
snode,*plstack;
//初始化
void initstack(plstack ps);
//入棧
bool push(plstack ps,int val);
//出棧(獲取棧頂值並刪除)
bool pop(plstack ps,int *rtval);
//獲取棧頂值但不刪除
bool gettop(plstack ps,int *rtval);
//獲取有效資料的個數
int getlength(plstack ps);
//判空
bool isempty(plstack ps);
//清空
void clear(plstack ps);
//摧毀
void destroy(plstack ps);
//列印
void show(plstack ps);
liststack.cpp
#include #include #include #include "liststack.h"
//初始化
void initstack(plstack ps)
//入棧(類似單鏈表的頭插)
bool push(plstack ps,int val)
//出棧(獲取棧頂值並刪除)
bool pop(plstack ps,int *rtval)
snode *p = ps->next;
*rtval = p->data;
ps->next = p->next;
free(p);
return true;}
//獲取棧頂值但不刪除
bool gettop(plstack ps,int *rtval)
snode *p = ps->next;
*rtval = p->data;
return true;}
//獲取有效資料的個數
int getlength(plstack ps)
return count;}
//判空
bool isempty(plstack ps)
//清空
void clear(plstack ps)
//摧毀
void destroy(plstack ps)}
//列印
void show(plstack ps)
printf("\n");
}
主函式:
#include #include //測試記憶體是否洩露的標頭檔案
#include "liststack.h"
int main()
show(&s);//測試列印
printf("%d\n",getlength(&s));//測試獲取有效資料的個數
int tmp;
gettop(&s,&tmp);//測試獲取棧頂元素的值但不刪除
printf("%d\n",tmp);
int tmp1;
while(!isempty(&s))
destroy(&s);//測試摧毀
destroy(&s);
return 0;
}
順序棧是棧的順序實現。順序棧是指利用順序儲存結構實現的棧。採用位址連續的儲存空間(陣列)依次儲存棧中資料元素,由於人棧和出棧運算都是在棧頂進行,而棧底位置是固定不變的,可以將棧底位置設定在陣列空間的起始處;棧頂位置是隨入棧和出棧操作而變化的,故需用乙個整型變數top來記錄當前棧頂元素在陣列中的位置
seqstack.h
#pragma once//防止標頭檔案重複引用
//不定長順序表實現棧
#define initsize 10
typedef struct stack
stack,*pstack;
//初始化
void initstack(pstack ps);
//入棧
bool push(pstack ps,int val);
//獲取棧頂值 但不刪除
//rtval:輸出引數
bool gettop(pstack ps,int *rtval);
//獲取棧頂值並刪除
bool pop(pstack ps,int *rtval);
//獲取有效資料個數
int getlength(pstack ps);
//判空
bool isempty(pstack ps);
//清空
void clear(pstack ps);
//摧毀
void destroy(pstack ps);
//列印
void show(pstack ps);
seqstack.cpp
#include #include #include #include "seqstack.h"
//初始化
void initstack(pstack ps)
//判滿(內部函式)
static bool isfull(pstack ps)
//擴容(內部函式)
static void inc(pstack ps)
//入棧
bool push(pstack ps,int val)
ps->elem[ps->top] = val;//ps->elem[ps->top++] = val;
ps->top++;
return true;}
//獲取棧頂值 但不刪除
//rtval:輸出引數
bool gettop(pstack ps,int *rtval)
*rtval = ps->elem[ps->top-1];
return true;}
//出棧 :獲取棧頂值並刪除
bool pop(pstack ps,int *rtval)
*rtval = ps->elem[ps->top-1];
ps->top--;
return true;}
//獲取有效資料個數
int getlength(pstack ps)
//判空
bool isempty(pstack ps)
//清空
void clear(pstack ps)
//摧毀
void destroy(pstack ps)
//列印
void show(pstack ps)
printf("\n");
}
主函式:
#include #include //測試記憶體洩漏的標頭檔案
#include "seqstack.h"
int main()
show(&s);//測試列印
printf("%d\n",getlength(&s));//測試獲取有效資料的個數
int tmp;
gettop(&s,&tmp);//測試獲取棧頂值 但不刪除
printf("%d\n",tmp);
int tmp1;
while(!isempty(&s))
destroy(&s);//測試摧毀
destroy(&s);
return 0;
}
資料結構 不定長順序棧
1 棧 stack 又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧 入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素 從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其...
資料結構 不定長順序表
順序表是在計算機記憶體中以陣列的形式儲存的線性表,所以順序表的儲存結構和陣列非常類似,而它最顯要的特點就是邏輯位址和實體地址都相連。alterlist.h pragma once pragma once是乙個比較常用的c c 預處理指令,只要在標頭檔案的最開始加入這條預處理指令,就能夠保證標頭檔案只...
資料結構 順序表(二) 不定長順序表
一 匯入 二 儲存結構 與定長的順序表的儲存結構相比較,不定長的順序表只增加乙個元素listsize 用於記錄當前順序表的總長度 具體結構如下圖所示 結構定義 typedef struct dseqlist int elem 指向存放資料的動態陣列 int length 有效資料個數 int lis...