標籤:類型 sqs struct 順序儲存結構 nbsp 遍曆 typedef class crm
從資料結構的角度看,棧和隊列也是線性表,其特殊性在於棧和隊列的基本操作是線性表操作的子集,它們是操作受限的線性表;
但從資料類型角度來看,它們是和線性表大不相同的兩種重要的抽象資料類型。
順序棧,即棧的順序儲存結構是用一組地址連續的儲存單元依次存放自棧頂到棧頂的資料元素
typedef struct{ int * base; //棧底指標,在棧構造之前和摧毀之後,base的值為NULL int * top; //棧頂指標,在非空棧始終指向棧頂元素的下一個位置 int stacksize; //當前已指派的儲存空間} SqStack;
base棧底指標:始終指向棧底位置,若base=NULL,則棧不存在
top棧頂指標:非空棧中的棧頂指標始終指向棧頂元素的下一個位置
注意順序棧的棧底也是存放資料的。
/*2016年10月28日20:46:25靜態棧*/#include<stdio.h>#include<malloc.h>#include<stdlib.h>#define STACK_INIT_SIZE 100 //儲存空間初始分配量#define SRAKINCRMENT 10 //儲存空間分配增量typedef struct{int * base; //棧底指標,在棧構造之前和摧毀之後,base的值為NULLint * top; //棧頂指標,在非空棧始終指向棧頂元素的下一個位置int stacksize; //當前已指派的儲存空間} SqStack;//函式宣告void InitStack(SqStack * S);void Push(SqStack * S, int e);void StackTraverse(SqStack * S);bool Pop(SqStack * S, int * e);int main(void){SqStack S;int val;InitStack(&S);Push(&S,1);Push(&S,2);Push(&S,3);Push(&S,4);StackTraverse(&S);printf("\n");Pop(&S, &val);Pop(&S, &val);StackTraverse(&S);return 0;}void InitStack(SqStack * S) //初始化靜態棧{S->base = (int *)malloc(STACK_INIT_SIZE * sizeof(int));if(NULL == S->base){printf("記憶體配置失敗,程式終止!\n");exit(-1);}S->top = S->base;S->stacksize = STACK_INIT_SIZE;return;}void Push(SqStack * S, int e) //壓棧{if( (S->top - S->base) >= S->stacksize) //如果棧滿{S->base = (int *)realloc(S->base, (S->stacksize + SRAKINCRMENT ) * sizeof(int)); if(NULL == S->base){printf("記憶體配置失敗,程式終止!\n");exit(-1);}S->top = S->base + S->stacksize;S->stacksize += SRAKINCRMENT;}*(S->top) = e;++(S->top);return;}void StackTraverse(SqStack * S) //遍曆輸出,從棧頂開始遍曆{int * p = S->top;while( S->base != p){printf("%d\n",*(p-1));--p;}return;}bool Pop(SqStack * S, int * e) //出棧{if(S->base == S->top) //如果空{return false;}*e = *(S->top);--(S->top);return true;}
順序棧用C語言實現