棧(鏈式存儲結構)
阿新 • • 發佈:2018-03-11
特性 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;
}
棧(鏈式存儲結構)