关于栈的的定义:栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。栈只能移除栈顶元素,也就是先进后出(FILO)原则
一、通过顺序存储设计一个栈结构
//要存储的数据类型
typedef int SElemType;
//栈的元素空间大小
#define MAXSPACE 20
typedef struct{
SElemType data[MAXSPACE];
int top;
}Static;
//初始化栈表
Status initStatic(Static * S){
S->top = -1;
return OK;
}
//入栈
Status pushStatic(Static * S , SElemType e){
if ((*S).top >= MAXSPACE-1) return ERROR;
(*S).data[S->top+1] = e;
(*S).top ++;
return OK;
}
//出栈
Status popStatic(Static * S , SElemType *e){
if ((*S).top <= -1)return ERROR;
(*S).top --;
*e = (*S).data[S->top+1];
return OK;
}
// 查看栈内元素
Status checkStatic(Static S ){
for (int i =-1; i< S.top; i++) {
printf("%d",S.data[i+1]);
}
printf("\n");
return OK;
}
int main(int argc, const char * argv[]) {
Static S;SElemType e;
initStatic(&S);
pushStatic(&S, 1); pushStatic(&S, 3);pushStatic(&S, 4);
checkStatic(S);
popStatic(&S,&e);
printf("删除掉 e:%d \n",e);
checkStatic(S);
return 0;
}
- 顺序栈不需要清空数组元素,根据top 获取最大下标即可,同理出栈只需要更改top-1
二、通过链式存储设计一个栈结构
//线性链表存储的栈
typedef struct nodeLink{
SElemType data;
struct nodeLink *next;
}nodeLink;
typedef struct nodeStatic{
int count;
struct nodeLink *top;
}nodeStatic;
Status initNodeStatic(nodeStatic *S){
S->top = NULL;
S->count = -1;
return OK;
}
Status pushNodeStatic(nodeStatic *S , SElemType e){
nodeLink * temp = (nodeLink *)malloc(sizeof(nodeLink));
if (!temp) return ERROR;
nodeLink *p = S->top;
temp->data = e;
temp->next = p;
S->top = temp;
S->count ++;
return OK;
}
Status popNodeStatic(nodeStatic *S){
if (S->count<=-1) return ERROR;
nodeLink *L = S->top;
S->top = S->top->next;
S->count --;
free(L);
return OK;
}
Status checkNodeStatic(nodeStatic S){
int count = S.count;
nodeLink *p = S.top;
while (count>-1) {
printf("%d",p->data);
p = p->next;
count --;
}
printf("\n");
return OK;
}
int main(int argc, const char * argv[]) {
nodeStatic S ;
initNodeStatic(&S);
pushNodeStatic(&S, 1);
pushNodeStatic(&S, 2);
pushNodeStatic(&S, 3);
checkNodeStatic(S);
popNodeStatic(&S);
checkNodeStatic(S);
return 0;
}
练习题letcode上的
- 括号匹配检验 假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,即()或[([][])]等为正确的格式,[(]或([())或(()])均为不正确的格式。输入一个包含上述括号的表达式,检验括号是否配对。
解题思路:
([{ 进行入栈操作, }]) 进行出栈操作,出栈时候进行栈顶判断,不匹配则报错