1. 程式人生 > >棧(鏈式存儲結構)

棧(鏈式存儲結構)

特性 null while raw 分享 leet source strlen http

  • 堆棧:具有一定操作約束的線性表,只能在一端作插入、刪除
  • 具有後入先出的特性(Last In First Out)
  • 順序存儲結構、鏈式存儲結構兩種形式



堆棧的順序存儲結構

通常由一個一維數組和一個棧頂元素變量組成

圖解如下:

技術分享圖片

技術分享圖片

技術分享圖片






形式一:構建結構體

0、結構初始化

#define MaxSize ###
struct StackNode {
    ElementType Data[MaxSize];
    int top;
};


1、建立空棧

struct StackNode* createStack() {
    struct StackNode* s=malloc(sizeof
(struct StackNode)); s->top=-1; return s; }


2、push操作

void push(struct StackNode* s,ElementType x) {
    if (s->top!=MaxSize-1)
        return s->Data[++(s->top)]=x;
    else
        return NULL;
}


3、pop操作

ElementType pop(struct StackNode* s) {
    if (s->top!=-1)
        return
s->Data[(s->top)--]; else return NULL; }

4、peek操作

ElementType peek(struct StackNode* s) {
    if (s->top!=-1)
        return s->Data[s->top];
    else
        return NULL;
}






形式二:簡易模式

也可以省略結構體部分,直接聲明數組,在函數中構建堆棧

//舉例020 Valid Parentheses 這一題
bool isValid(char* s) {
    int len=strlen(s);
    if
(*s==NULL) return false; if (len%2==1) return false; char stack[1000000]; int top=-1; while (*s) { char c=*s; if (c==‘(‘||c==‘{‘||c==‘[‘) { stack[++top]=c; } else { if (c==‘)‘&&top>=0&&stack[top]==‘(‘) top--; else if (c==‘]‘&&top>=0&&stack[top]==‘[‘) top--; else if (c==‘}‘&&top>=0&&stack[top]==‘{‘) top--; } s++; } return top==-1; }

棧(鏈式存儲結構)