数据结构——栈的学习
来源:互联网 发布:广州淘宝拍照的地方 编辑:程序博客网 时间:2024/06/19 05:12
一、什么是栈?
- 栈是限制在一端进行操作(插入、删除)的线性表;
- 我们俗称为堆栈;
- 只不过是一种特殊的线性表,有顺序栈、也有链式栈
二、栈的特点
- 具有先进后出的特点,即先进栈的数据后出栈(LIFO);
- 入栈出栈可交替进行;
对于特点1、2经常出面试题目:一个栈的入栈序列为ABCDE,则不可能的出栈序列为? (AB)A:ECDBAB:DCEABC:DECBAD:ABCDEE:EDCBA解析:A:E先出可以做到,C绝对不能在E先出的情况下比B先出栈;所以A错; B:D最先出栈,说明之前进栈顺序为ABCD,出栈时B先出A后出,故B错 C:C先出栈,所以是A,B,C,D依次入栈,D出栈E入栈,E出栈,CBA依次出栈; D,E:正确;
3.栈的操作只能在线性表的表尾进行,即是我们所说的栈顶;
4.对于栈的实现一般才用顺序结构;
三、栈的实现
typedef int ElemType;typedef struct{ ElemType *base;//指向栈底的指针 ElemType *top;//指向栈顶的指针 int StackSize;//栈的当前大小}sqstack_t;/*创建一个栈*/void stack_cread(sqstack_t *q){ q->base = (ElemType *)malloc(sizeof(ElemType)*MAX_SIZE);//用malloc函数申请一个(sizeof(ElemType)*MAX_SIZE大小的空间,并用base指向它; if(!q->base) { printf("creat stack failed\n");//为空,申请失败; exit(0); } q->top=q->base;//创建时栈为空,即我们的栈顶指针和栈底指针指向同一个地方; q->StackSize=MAX_SIZE;//我们申请的栈的大小为100}//入栈操作void stack_push(sqstack_t *q,ElemType e){ if(q->top-q->base>=q->StackSize) { q->top=(ElemType *)realloc(q->top,sizeof(ElemType)*(MAX_SIZE+ADD_SIZE));//当栈满时,我们给它增加空间; if(!q->top) { printf("creat failed\n"); exit(0); } q->StackSize+=ADD_SIZE; } *(q->top)=e; q->top++;//当前的栈顶指针指向的空间为空,就是这个存储单元没值,入栈时直接放了该空间,然后指针++,方便下次的入栈操作}void stack_pop(sqstack_t *q,ElemType *e){ if(q->top==q->base) { printf("stack is empty\n"); exit(0); } else *e=*(--(q->top));//因为当前的栈顶指针指向的空间为空,就是这个存储单元没值,方便入栈,所以出栈要先--;}
四、栈的应用
1、实现逆波兰标识法:利用栈的特点;输入为数字,就入栈,输入为运算符号出栈两次,根据符号计算结果,然后结果入栈;
#include <stdio.h>#include <stdlib.h>#include <math.h>#include <ctype.h>typedef char ElemType;//typedef int ElemType;#define MAX_SIZE 100#define ADD_SIZE 10typedef struct{ ElemType *base;//指向栈底的指针 ElemType *top;//指向栈顶的指针 int StackSize;//栈的当前大小}sqstack_t;void stack_cread(sqstack_t *);void stack_push(sqstack_t *q,ElemType e);ElemType stack_pop(sqstack_t *q);int stack_clear(sqstack_t *q);void stack_show(sqstack_t *q);int main(){ char ch; int i=0; char arr[10]; double num1,num2,num; sqstack_t Q; stack_cread(&Q); printf("please input the number:"); scanf("%c",&ch); while(ch!='#') { while(isdigit(ch)||ch=='.')//判断是否为数字 { arr[i++]=ch; arr[i]='\0'; scanf("%c",&ch); if(ch==' ') { num=atoi(arr);//字符串转为数值 stack_push(&Q,num); i=0; } } scanf("%c",&ch); switch (ch) { case '+':num1=stack_pop(&Q); num2=stack_pop(&Q); stack_push(&Q,num1+num2); break; case '-':num1=stack_pop(&Q); num2=stack_pop(&Q); stack_push(&Q,num2-num1); break; case '*':num1=stack_pop(&Q); num2=stack_pop(&Q); stack_push(&Q,num1*num2); break; case '/':num1=stack_pop(&Q); num2=stack_pop(&Q); if(num1!=0) stack_push(&Q,num2/num1); else printf("error"); break; } } printf("%f",(float)stack_pop(&Q));
return 0; }
printf("%f",(float)stack_pop(&Q));return 0;
}
0 0
- 数据结构——顺序栈的学习
- 数据结构——链栈的学习
- 数据结构——栈的学习
- 数据结构学习——栈
- 数据结构---栈的学习
- 基于java的数据结构学习手记3——栈
- 数据结构学习(八)——顺序栈的相关操作
- 数据结构学习(九)——链栈的操作
- 数据结构——两栈共享一个数组的学习
- 数据结构学习——树的基本概念
- 数据结构——线性表的学习
- 数据结构——循环队列的学习
- 数据结构——队列的学习
- Nginx学习(3)—封装的数据结构
- 数据结构学习五—树的简介
- 数据结构学习总结——数据结构概述
- 栈学习——传说中的数据结构
- 数据结构学习笔记1——栈
- Python3 字符串
- Android-->Log系统,Logback的使用体验(slf4j)
- 51nod 乘法逆元(扩展欧几里得)
- Hibernate 异常StrategySelectionException: Unable to resolve name EhCacheRegionFactory
- 阻止冒泡
- 数据结构——栈的学习
- 随手记录-通信协议基础知识
- Codeforces gym 101102 A dp
- 如何用一个宏将一个数字的奇数位和偶数位交换
- JS 中除cookie存储外,还有哪些存储方式?
- Servlet--登录案例及编码解决方案
- JSON学习笔记
- AndroidAnnotations注解框架
- 随手记录--网络编程