数据结构之线性结构应用----栈

栈(stack)

一、定义

  一种可以实现“后进先出(LIFO,last in first out)”的存储结构,即后存放进栈的数据要先出去。就像箱子里取书一样,先拿上面的书,再拿下面的书。

二、栈的分类

  静态栈:即采用连续存储(数组)的方式实现

  动态栈:即采用离散存储(链表)的方式实现,示意图如下

 

 

 

 

 

 

 

 

 

 

 

 

三、 动态栈的操作

  • 压栈:即将元素送入栈内
  • 出栈:即将元素从顶部拿走
  • 创建(初始化)、遍历等
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

typedef struct Node
{
    int data;
    struct Node *pNext;
}NODE,*PNODE;

typedef struct Stack
{
    PNODE pTop;
    PNODE pBottom;
}STACK,*PSTACK;
    
void init_stack(PSTACK);
void traverse_stack(PSTACK);
void push_stack(PSTACK,int);
int is_empty_stack(PSTACK);
void pop_stack(PSTACK);
void clear_stack(PSTACK);

void init_stack(PSTACK ps)
{
    ps=(PSTACK)malloc(sizeof(STACK));//为什么不要这一句也可以?
    ps->pTop=(PNODE)malloc(sizeof(NODE));//相当于创建了一个头节点
    if(ps->pTop==NULL)
    {
        printf("内存分配失败\n");
        exit(-1);
    }
    else
    {
        ps->pBottom=ps->pTop;//让该栈两个指针都指向头结点
        ps->pTop->pNext=NULL;//让头结点指向的首节点为NULL
    }
    return;
}

void traverse_stack(PSTACK ps)
{
    PNODE q;
    q=ps->pTop;
    if(is_empty_stack(ps))
    {
        printf("栈空");
        return;
    }
    while(q!=ps->pBottom)
    {
        printf("%d ",q->data);
        q=q->pNext;
    }
    printf("\n");
    return;
}

void push_stack(PSTACK ps,int val)
{
    PNODE pNew;
    pNew=(PNODE)malloc(sizeof(NODE));
    if(pNew==NULL)
    {
        printf("内存分配失败\n");
        exit(-1);
    }
    pNew->data=val;
    pNew->pNext=ps->pTop;
    ps->pTop=pNew;
    return;
}

int is_empty_stack(PSTACK ps)
{
    if(ps->pTop==ps->pBottom)
        return 1;
    return 0;
}

void pop_stack(PSTACK ps)
{
    PNODE q;
    if(is_empty_stack(ps))
    {
        printf("栈为空\n");
    }
    else
    {
        q=ps->pTop;
        printf("出栈:%d\n",q->data);
        ps->pTop=q->pNext;
        free(q);
        q=NULL;
    }
    return;
}

void clear_stack(PSTACK ps)
{
    PNODE q;
    if(is_empty_stack(ps))
    {
        printf("已经空\n");
        return;
    }
    else
    {
        while(ps->pTop!=ps->pBottom)
        {
            q=ps->pTop;
            ps->pTop=q->pNext;
            free(q);
            q=NULL;
        }
    }
}


void main()
{
    STACK s;
    init_stack(&s);
    push_stack(&s,1);
    push_stack(&s,3);
    push_stack(&s,2);
    push_stack(&s,4);
    traverse_stack(&s);
    pop_stack(&s);
    pop_stack(&s);
    traverse_stack(&s);
    clear_stack(&s);
    traverse_stack(&s);
    return;
}

四、静态栈的基本操作

   创建、入栈、出栈概略

typedef struct
{
    int data[1000];
    int top;
}SeqStack;

void push(SeqStack *S,int e)
{
    if(S->top ==1000-1)
    {
        return;
    }
    S->top++;
    S->data[S->top]=e;
    return;
}

void pop((SeqStack *S,int e)
{
    if(S->top==-1)
        return;
    *e=S->data[S->top];
    S->top--;
    return;
}

 五、栈的应用----四则运算表达式求值

  我们平常所学的标准四则运算表达式如:9+(3-1)×3+10÷2,也叫中缀表达式,转化为后缀表达式为:9 3 1 - 3 × + 10 2 ÷ +

  计算机通过栈来把用户输入的中缀表达式转换为后缀表达式,再通过栈将后缀表达式求出来。

  具体详见书本。

posted @ 2021-08-16 16:46  Pangenda  阅读(84)  评论(0编辑  收藏  举报