c語言數據結構學習心得——棧
阿新 • • 發佈:2019-03-26
else tom 語言 col 新元素 color double 最大 -s
棧(Stack)
只允許在一端進行插入或刪除操作的線性表
棧頂(Top):棧中允許進行插入和刪除操作的那一端;
棧底(Bottom):固定的,不允許進行插入或刪除的另一端
1.棧是受限的線性表,所以自然具有線性關系。
2.棧中元素後進先出。
棧的順序存儲==順序棧
#define MaxSize 50 //定義棧中元素的最大個數 typedef struct{ Elemtype data[MaxSize]; //存放棧中元素 }Sqstack; //順序棧簡寫
1.Top的值不能超過MaxSize;
2.空棧的判定條件通常為top==-1,滿棧的判定條件為top=MaxSize-1,棧中元素個數為top+1.
順序棧的操作:
1.判空
bool StackEmpty(SqStack S){ if(S.top==-1) return true; else return false; }
2.進棧
bool Push(SqStack &S,Elemtype x){ if(S.top==MaxSize-1) return false; S.data[++S.top]=x; return true; }
3.出棧
bool Pop(SqStack &S,Elemtype &x){if(S.top==-1) return false; x=S.data[S.top--]; return true; }
4.讀取棧頂元素
bool GetTop(SqStack S,Elemtype &x){ if(S.top==-1) return false; x=S.data[S.top];return true; }
共享棧
順序棧的存儲空間大小需要事先開辟好,對每個棧各自單獨開辟存儲空間的利用率不如將各個棧存儲空間共享。
棧滿條件下:指針top1與指針top2只相差1,即top1+1=top2.
結構:
#define MaxSize 100 //定義棧中元素的最大個數 typedef struct{ Elemtype data[MaxSize]; //存放棧中元素 int top1; int top2; }SqDoublestack; //順序共享棧簡寫
進棧:
bool Push(SqDoubleStack &S,ElemType x,int stackNum0{ if(S.top1+1=S.top2) return false; if(stackNum==1) S.data[++S.top1]=x;//棧1有元素進棧 if(stackNum==2) S.data[++S.top2]=x;//棧2有元素進棧 return true; }
棧的鏈式存儲==鏈棧
頭指針當作棧頂指針,棧頂存放在單鏈表頭部。
typedef struct SNode{ ElemType data; //存放棧中元素 struct SNode *next; //棧頂指針 }SNode *SLink //鏈棧的結點 typedef struct LinkStack{ SLink top; //棧頂指針 int count; //鏈棧結點數 }LinkStack //鏈棧
1.鏈棧一般不存在滿棧
2.空棧的判定關系一般為top=NULL
進棧
bool Push(LinkStack &S,ElemType x){ SLink p=(SLink)mallo((sizeof(SNode));//給新元素分配空間 p->data=x; //新元素的值 p->next=s->top; //p的後繼指針指向新的元素 s->top=p; //棧頂指針指向新的元素 s->count++; //棧中元素加1 return true; }
出棧
bool Pop(LinkStack &S, ElemType &x){ if(S->top==NULL) return false; x=S->top->data; //棧頂元素值 Slink p=S->top; //輔助指針 S->top=S->top->next; //棧頂指針後移 free(p); //釋放被刪除數據的存儲空間 S->count--; 棧中元素個數減1 return true; }
c語言數據結構學習心得——棧