堆栈的两种表示方法-数据结构学习笔记2.2

本文介绍了栈的基本概念,包括顺序存储、链式存储及其改进方式,并详细展示了使用C语言实现这些存储方式的具体代码。此外,还探讨了栈的应用场景,如中缀表达式转后缀表达式的算法及在递归、回溯等算法中的作用。
顺序存储表示
#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可以通过指针来达到“双向传值的目的”.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值