棧的順序儲存結構和鏈式儲存結構
阿新 • • 發佈:2019-01-02
1.棧的定義:
在表尾進行插入和刪除操作的線性表(仍然滿足線性表的操作,只是在push和pop有些區別)
棧頂(top)允許插入和刪除,另一端稱棧底(bottom),不含任何資料元素的棧叫空棧。
棧:後進先出(last in first out)的線性表,簡稱LIFO結構。
棧的插入稱為進棧,也稱壓棧,入棧。
棧的刪除稱為出棧,也稱彈棧。
2.棧的抽象資料結構
因為棧本身就是一個線性表,所以線性表的操作特性它都具備,針對它的特殊性,在它的操作上可能會有一些變化。將進棧和出棧分別改名為push和pop。由於棧本身是一個線性表,所以線性表的順序儲存結構和鏈式儲存結構同樣適用於棧。
3.棧的順序儲存結構
棧的順序儲存結構,簡稱順序棧。定義一個top變數來指示棧定元素在陣列中的位置。若儲存棧的長度為StackSize,則棧頂位置top必需小於StackSize。下標從0開始,當棧存在一個元素時候,top 等於 0 ,當棧為空棧時候,top 等於 -1。
棧的結構定義
typedef int SElemType;
typedef struct {
SElemType data[MAXSIZE];
int top; //用於棧頂指標
} SqStack;
若現在有一個棧,StackSize為5,則普通棧、空棧、滿棧的情況如下圖所示。
4.進棧
status pushStack(stack* s ,SElemType e)
{
if(s->top == MaxSize - 1 )
exit(error);
s->top++;
s->data[s->top] = e;
//s->top++;
return OK;
}
5.出棧
status popStack(stack* s )
{
if(s->top == -1)
exit(error);
s->top--; //出棧並不是把這個元素改為0才可以。
}
//棧的順序儲存結構 #include<iostream> #define MaxSize 10 #define OK 1 #define error -1 using namespace std; typedef int SElemType; typedef int status; typedef struct { SElemType data[MaxSize]; int top; }stack; //兩棧共享空間 typedef struct { SElemType data[MaxSize]; int top1; int top2; }DoubleStack; stack* creatStack() { stack *stack1 = (stack*)malloc(sizeof(stack)); stack1->top = -1; return stack1; } status pushStack(stack* s ,SElemType e) { if(s->top == MaxSize - 1 ) exit(error); s->top++; s->data[s->top] = e; //s->top++; return OK; } status popStack(stack* s ) { if(s->top == -1) exit(error); s->top--; //出棧並不是把這個元素改為0才可以。 } void printStack(stack* s) { while(s->top != -1) { //s->data 是棧的首地址 cout<<s->data[s->top]<<endl; s->top--; } } //兩棧共享空間 status pushDoubleStack(DoubleStack *s ,SElemType num ,SElemType insertStack) { if(s->top1 + 1 == s->top2) return error; if(insertStack!= 1&&insertStack != 2 ) return error; if(insertStack == 1) s->data[++s->top1] = num; else if (insertStack == 2) s->data[--s->top2] = num; return OK } //--和 ->運算等級 status popDoubleStack(DoubleStack *s ,SElemType* e ,SElemType deleteStack) //SElemType* e 來接受出棧的值 deleteStack從棧1 或者棧2 刪除 { if(deleteStack == 1) { //首先進行判斷空處理 if(s->top1 == -1) return error; *e = s->data[s->top1++]; } else if(deleteStack == 2) { if(s->top2 == MaxSize) return error; *e = s->data[s->top2--]; } return OK; } void main() { stack *s = creatStack(); pushStack( s ,5 ); printStack(s); }
棧的鏈式儲存結構稱做鏈棧。
鏈棧空的定義top == NULL
進棧操作
status pushStackLinkList(StackLinkList* s,eleType e)
{
Stacknode* p = (Stacknode*)malloc(sizeof(Stacknode));
p->data = e;
p->next = s->top;
s->top = p;
s->count++;
return OK;
}
出棧操作
status popStackLinkList(StackLinkList* s,eleType* e)
{
//判斷空處理
if(s->top == NULL)
return error;
*e = s->top->data;
Stacknode* p = s->top;
s->top = s->top->next;
free(p);
s->count--;
return OK;
}
棧的應用 ---遞迴!(沒有寫程式碼)