3.1 顺序栈,链栈(带头结点)及其应用

目录

一:顺序栈及其基本操作

1.头文件

2.定义

3.初始化

4.判空

5.进栈

6.出栈

7.读取栈顶元素

8.主函数

二:链栈及其基本操作

1.头文件

2.定义

3.初始化

4.出栈

5.入栈

6.判空

7.取栈顶元素

8.主函数

三:链栈的应用

1.括号匹配

算法理解:

2.中缀表达式转后缀表达式(逆波兰表达式)—左优先

算法理解:

3.后缀表达式的计算

算法理解:

4.中缀表达式转前缀表达式(波兰表达式)——右优先

算法理解:


一:顺序栈及其基本操作

1.头文件

#include <iostream>

2.定义

//栈的顺序存储类型描述
#define MaxSize 50
typedef struct {
    int data [MaxSize];//存放栈中元素
    int top;//栈顶指针
}SeqStack;

3.初始化

//初始化
void InitStack(SeqStack &S){
    S.top=-1;
}

4.判空

//判空
bool StackEmpty(SeqStack S){
    if (S.top==-1){
        printf("yes\n");
        return true;
    } else{
        printf("no\n");
        return false;
    }
}

5.进栈

//进栈
bool Push(SeqStack &S,int e){
    if(S.top==MaxSize-1){
        return false;//栈满
    }
    S.data[++S.top]=e;//指针先+1,再调用入栈
    return true;
}

6.出栈

//出栈
int Pop(SeqStack &S){
    if(S.top==-1){//栈为空
        return false;
    }
    int x=S.data[S.top--];//指针先-1,再调用出栈
    return x;
}

7.读取栈顶元素

//读取栈顶元素
int GetTop(SeqStack S){
    if(S.top==-1){//栈为空
        return false;
    }
    int x=S.data[S.top];
    return x;
}

8.主函数

int main() {
    SeqStack S;
    InitStack(S);
    StackEmpty(S);
    Push(S,1);
    int i=GetTop(S);
    printf("%d\n",i);
    Push(S,2);
    Push(S,3);
    i=GetTop(S);
    printf("%d\n",i);
    Pop(S);
    i=GetTop(S);
    printf("%d\n",i);
    Pop(S);
    Pop(S);
    StackEmpty(S);
    return 0;
}

运行结果:

yes
1
3
2
yes

进程已结束,退出代码为 0

二:链栈及其基本操作

1.头文件

#include <iostream>

2.定义

//定义
typedef struct LinkNode{
    int data;
    struct LinkNode *next,*top;
}LinkNode,*LinkStack;

3.初始化

//初始化
void InitLinkStack(LinkStack &S){
    S=(LinkStack) malloc(sizeof(LinkNode));//分配一个头结点
    S->next= NULL;//初始化循环单链表为空
    S->top=S;
}

4.出栈

//出栈
bool DeleteLinkStack(LinkStack &S){
    if(S->next==NULL){
        return false;//栈为空
    }
    LinkNode *q=S->top;
    int x=q->data;
    S->top=S->top->next;
    S->next=S->top;
    free(q);
    return true;
}

5.入栈

//入栈
void InLinkStack(LinkStack &S,int e){
    LinkNode *s=(LinkStack)malloc(sizeof(LinkNode));
    s->data=e;
    s->next=S->top->next;
    S->top=s;
    S->next=s;
}

6.判空

//判空
bool isEmpty(LinkStack S){
    if(S->next==NULL){
        printf("Empty\n");
        return true;
    } else{
        printf("No empty\n");
        return false;
    }
}

7.取栈顶元素

//取栈顶元素
bool GetLinkStack(LinkStack S){
    if(S->next==NULL){
        return false;//栈为空
    }
    int x=S->top->data;
    printf("top data=%d\n",x);
    return true;
}

8.主函数

int main() {
    LinkStack s;
    InitLinkStack(s);
    isEmpty(s);
    InLinkStack(s,1);
    isEmpty(s);
    GetLinkStack(s);
    InLinkStack(s,2);
    GetLinkStack(s);
    DeleteLinkStack(s);
    GetLinkStack(s);
    DeleteLinkStack(s);
    isEmpty(s);
    return 0;
}

运行结果:

Empty
No empty
top data=1
top data=2
Empty

进程已结束,退出代码为 0

三:链栈的应用

1.括号匹配

算法理解:

        1.左括号入栈

        2.右括号出栈并匹配

        3.失败情况:

                无左括号余右括号(即栈空但字符串还未扫描完)

                无右括号,余左括号(即扫描完,但栈非空)

                左右括号不匹配        

2.中缀表达式转后缀表达式(逆波兰表达式)—左优先

算法理解:

        1.从左往右扫描

        2.遇到操作数直接输出

        3.遇到下一个运算符与栈中的运算符作比较,如果比栈中高级或栈为空,则直接压入栈中,如果和栈中的平级或比栈中的低级,先将栈中比他低级和平级的依次出栈输出,再将其压入栈中

        4.遇到(直接入栈,遇到)直接一直出栈到(,并依次打印除了(以外的运算符

        5.全部扫描完依次打印栈中剩余运算符

3.后缀表达式的计算

算法理解:

        1.从左往右扫描,遇到操作数入栈

        2.遇到运算符op,连续出栈2次,依次赋值给下x1,x2

        3.x=x1x2op,并重新压回栈中

        4.全部扫描后栈顶结束计算结果

4.中缀表达式转前缀表达式(波兰表达式)——右优先

算法理解:

        1.从右往左扫描

        2.遇到操作数压入栈2

        3.遇到运算符与栈1中的运算符作比较,如果比栈1中高级或栈为空,直接压入栈1中,如果和栈1中的平级或比栈1中的低级,先将栈1中比他低级和平级的依次出栈1并压入栈2 ,再将其压入栈1中

        4.遇到)直接入栈,遇到(直接一直出栈到),并依次将除了(以外的运算符压入栈2

        5.全部扫描完依次出栈1中剩余运算符,并压入栈2中

        6.依次输出栈2中运算符和操作数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值