顺序存储表示
#include<stdio.h>
#include <stdlib.h>
typedef int Elem;
#define MAX 200
const Elem ERROR=-1;
typedef struct{
Elem data[MAX];
int top;
}*S,SS;
S createStack(){
S s=(S)malloc(sizeof(SS));
s->top=-1;
return s;
}
int push(Elem e,S s){
if(s->top==MAX-1)
return -1;
s->data[++s->top]=e;
s++;
return 1;
}
Elem pop(S s){
if(s->top==-1)
return ERROR;//ERROR为Elem的特殊值,表示错误
Elem tmp=s->data[s->top--];
return tmp;
}
int main(){
S test= createStack();
push(5,test);
printf("%d",pop(test));
return 0;}
链式存储表示
#include<stdio.h>
#include <stdlib.h>
typedef int Elem;
const Elem ERROR=-1;
struct Node{
Elem e;
struct Node *next;
};
typedef struct Node *LNode,*S,Node;//真正的类型为struct Node 对它重新命名
S createStack(){//创建一个头结点,头指针指向它-----创建空栈
S s=(LNode)malloc(sizeof(Node));
s->next=NULL;
return s;
}
void push(Elem e,S s){
//LNode tmp;
//tmp=s->next;
LNode lnode=(LNode)malloc(sizeof(Node));
lnode->e=e;
lnode->next=s->next;
s->next=lnode;
}
Elem pop(S s){
if(s->next==NULL)
return ERROR;
LNode tmp=s->next;
Elem e=tmp->e;
s->next=tmp->next;
free(tmp);
return e;
}
int main(){
S test= createStack();
push(5,test);
printf("%d",pop(test));
return 0;}
顺序存储改进
#include<stdio.h>
#include <stdlib.h>
typedef int Elem;
const Elem ERROR=-1;
typedef struct SNode{
Elem *data;
int top;
int MAX;
}*S;
S createStack(int max){//
S s=(S)malloc(sizeof(struct SNode));
s->data=(Elem*)malloc(max*sizeof(Elem));
s->top=-1;
s->MAX=max;
return s;
}
int push(Elem e,S s){
if(s->top==s->MAX-1)
return -1;
s->data[++s->top]=e;
}
Elem pop(S s){
if(s->top==-1)
return ERROR;
return s->data[s->top--];
}
int main(){
S test= createStack(20);
push(5,test);
printf("%d",pop(test));
return 0;
}
堆栈应用:如何将中缀表达式变为后缀表达式
1:碰到数字直接输出
2:遇到左括号,将左括号入堆。(左括号可以看作运算符,堆栈里和堆栈外优先级不同)。
3:遇到右括号,将堆栈输出直到左括号(括号不输出)
4:运算符优先级比栈顶大,将运算符压入堆栈。
5:运算符优先级比栈顶小,弹出输出只到此运算符比栈顶运算符大时再将此运算符压入堆栈
6:运算对象处理完毕后堆栈有残余,将它们一并输出。
堆栈在其他算法里应用:
1:递归算法(系统把调用函数前的状态压入堆栈,函数返回时弹出堆栈还原调用前状态)
2:回溯算法
3:深度优先算法
。。。。。。。。
额外话题:C语言没有C++的引用变量,只能单项传值,C可以通过指针来达到“双向传值的目的”.