数据结构之线性结构应用----栈
栈(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 ÷ +
计算机通过栈来把用户输入的中缀表达式转换为后缀表达式,再通过栈将后缀表达式求出来。
具体详见书本。