1,什么是栈?
栈好比一个羽毛球袋,只有一个口让你拿球和塞球。也就是俗话说的后入先出(LIFO)
对栈的操作只有两个push 和 pop
2,showshow code
如何实现一个栈
下面用两种方法实现,大家可以自行对比
①判断是否为NULL
bool isEmpty(Stack Stk){
return s->next == NULL;
}
②创建一个空栈
Stack CreateStack(void){
Stack stk;
S = malloc(sizeof(Stack));
if(S == NULL){
return NULL;
}
while(!isEmpty(S)){
Pop(S);
}
}
struct Stack{
int top;
int maxtop;
int* nums;
}
Stack CreateStack(int max){
Stack stk = malloc(sizeof(struct Stack));
stk->nums = malloc(sizeof(max));
stk->maxtop = max;
stk->top = 0;
}
③入栈
void Push(Stack stk, int val){
Node temp = malloc(sizeof(Node));
temp->val = val;
temp->next = stk->next;
stk->next = temp;
}
void push(Stack stk, int val){
stk->nums[stk->top++] = val;
}
④返回栈顶元素
int Top(Stack stk){
if(!stk->next){
return 0;
}
return stk->next->val;
}
int Top(Stack stk){
return stk->nums[stk->top-1];
}
⑤出栈
void Pop(Stack stk){
Node temp;
temp = stk->next;
stk->next = temp->next;
free(temp);
}
void Pop(Stack stk){
stk->top--;
}
3,栈的简单应用
①平衡符号:编译器检验语法错误
思路:创建一个空栈,读入字符。 如果字符是一个开放符号---({[,则入栈;
如果字符是一个封闭符合,则弹出栈中元素,不一致或者栈空则报错。
读入字符结束,栈中还有元素则报错。
②后缀表达式(逆波兰数)
思路:描述加减乘除四则运算
举个例子:
逆波兰数:6 5 2 3 + 8 * + 3 + *
第一步:栈中元素 3 2 5 6
第二步:读'+', 则弹出3,2 并将5入栈 栈中元素变为 5 5 6;同时8 进栈 8 5 5 6
第三步:读'*',则弹出8 5,并将40入栈 栈:40 5 6
第四步:读'+',则弹出40 5 ,并将45入栈 栈:45 6;同时3入栈 3 45 6
第五,六步:依次读'+' '*',最后得到结果 288
③如何将算式转化为逆波兰数呢?
a + b * c + (d * e + f) * g
首先搞清楚算数优先级:'*' == '/' > '+' == '-'
思路:操作数输出,操作符入栈,并弹出优先级 >= 本身的操作符
’(‘优先级最高,遇到')'将中间所有操作符弹出
举个例子:
a b c * + d e * f + g * +
到此为止,你已经明白栈是什么东西了,现在开始做题吧~
1,有效的括号
2,二叉树展开为链表
3,每日温度
5,最小栈
6,柱状图中最大矩形
7,接雨水