【数据结构】栈stack
来源:互联网 发布:mac air 电池容量 编辑:程序博客网 时间:2024/05/17 23:59
【数据结构 - 栈】
数据结构由"一组存储区"和"相关函数"构成
每一种数据结构代表了这些存储区的管理方法
这些函数提供了这些存储区的使用方法
只有这些函数才能直接使用这些存储区
"栈"是一种数据结构
栈可以用来存放数字,栈里的数字有"前后顺序"
先放进去的数字在前,后放进去的数字在后
从栈里获得的永远是"最后一个放进去的数字"
这种使用方法叫做"后进先出"
实现栈的时候需要提供一个函数"向栈里放数字",这个函数名通常叫"push"
实现栈的时候需要提供另一个函数"从栈里拿数字",这个函数名叫"pop"
<栈的实例演示,代码可做框架>
【练习】
编写程序计算一个四则表达式的结果
表达式里只包含 + - * / 四种符号
表达式里每个数字都是个位数
表达式里没有空格
表达式的长度不超过 50 个字符
<思想>
如 6+3*6/2-4,6 + 3 逐个放到栈里,* 开始计算,结果18放到栈里,依次不能处理的放到栈里,能处理的优先处理(已画图示)
数据结构由"一组存储区"和"相关函数"构成
每一种数据结构代表了这些存储区的管理方法
这些函数提供了这些存储区的使用方法
只有这些函数才能直接使用这些存储区
"栈"是一种数据结构
栈可以用来存放数字,栈里的数字有"前后顺序"
先放进去的数字在前,后放进去的数字在后
从栈里获得的永远是"最后一个放进去的数字"
这种使用方法叫做"后进先出"
实现栈的时候需要提供一个函数"向栈里放数字",这个函数名通常叫"push"
实现栈的时候需要提供另一个函数"从栈里拿数字",这个函数名叫"pop"
<栈的实例演示,代码可做框架>
/*代码*/ .c源文件#include "02stack.h"void stack_init(stack *p_stack) { //初始化栈 p_stack->num = 0;}void stack_deinit(stack *p_stack) { //清理栈内容 p_stack->num = 0;}int stack_empty(const stack *p_stack) { //判断栈是否为空 return !(p_stack->num);}int stack_full(const stack *p_stack) { //判断栈是否是满 return p_stack->num >= SIZE;}int stack_size(const stack *p_stack) { //获得有效数字个数 return p_stack->num;}//向栈里放数字的函数,num代表新放的数void stack_push(stack *p_stack, int num) { p_stack->buf[p_stack->num] = num; //p_stack->num数组下标 p_stack->num++;}//从栈里获得数字的函数,会把数字从栈里删除int stack_pop(stack *p_stack) { int ret = p_stack->buf[p_stack->num - 1]; p_stack->num--; return ret;}//从栈里获得数字的函数,不会把数字从栈里删除int stack_top(const stack *p_stack) { return p_stack->buf[p_stack->num - 1]; }/*代码*/ .h头文件#ifndef __02STACK_H__#define __02STACK_H__#include <stdio.h>typedef struct { int buf[SIZE]; int num; //有效数字个数} stack;void stack_init(stack *); //初始化函数void stack_deinit(stack *); //清理函数int stack_empty(const stack *); //判断栈是否为空int stack_full(const stack *); //判断栈是否是满int stack_size(const stack *); //获得有效数字个数//向栈里放数字的函数,num代表新放的数void stack_push(stack *, int);//从栈里获得数字的函数,会把数字从栈里删除int stack_pop(stack *); //从栈里获得数字的函数,不会把数字从栈里删除int stack_top(const stack *); #endif //__02STACK_H__/*代码*/ .c主函数#include <stdio.h>#include "02stack.h"int main() { stack stk = {0}; //这个结构体变量代表一个栈【声明1个栈】 stack_init(&stk); //【初始化栈】 printf("有效数字个数是:%d\n", stack_size(&stk)); //0 printf("判断空的结果是:%d\n", stack_empty(&stk)); //1 printf("判断满的结果是:%d\n", stack_full(&stk)); //0 stack_push(&stk, 1); //放进去一个数字 1 stack_push(&stk, 3); //放进去一个数字 3 stack_push(&stk, 5); //放进去一个数字 5 printf("有效数字个数是:%d\n", stack_size(&stk)); //3 printf("判断空的结果是:%d\n", stack_empty(&stk)); //0 printf("判断满的结果是:%d\n", stack_full(&stk)); //0 stack_push(&stk, 7); //放进去一个数字 7 stack_push(&stk, 9); //放进去一个数字 9 printf("有效数字个数是:%d\n", stack_size(&stk)); //5 printf("判断空的结果是:%d\n", stack_empty(&stk)); //0 printf("判断满的结果是:%d\n", stack_full(&stk)); //1 printf("最后一个数字是:%d\n", stack_top(&stk));//9 printf("%d ", stack_pop(&stk)); //9 printf("%d ", stack_pop(&stk)); //7 printf("%d ", stack_pop(&stk)); //5 printf("%d ", stack_pop(&stk)); //3 printf("%d \n", stack_pop(&stk)); //1 stack_deinit(&stk); //【清理栈】 return 0;}
【练习】
编写程序计算一个四则表达式的结果
表达式里只包含 + - * / 四种符号
表达式里每个数字都是个位数
表达式里没有空格
表达式的长度不超过 50 个字符
<思想>
如 6+3*6/2-4,6 + 3 逐个放到栈里,* 开始计算,结果18放到栈里,依次不能处理的放到栈里,能处理的优先处理(已画图示)
/*代码*/#include <stdio.h>#include "02stack.h"int main() { char buf[100] = {0}; char *p_ch = buf; char opr = '0'; //+ - * / 符号 int num = 0, num1 = 0; //num记录前面一个数,num1记录后面一个数 stack stk = {0}; stack_init(&stk); printf("请输入一个计算表达式:"); fgets(buf, 100, stdin); while(1) { if(*p_ch >= '0' && *p_ch <= '9') { stack_push(&stk, *p_ch - '0'); //字符转换数字入栈 } else if(*p_ch == '+' || *p_ch == '-') { if(stack_size(&stk) == 3) { num1 = stack_pop(&stk); opr = stack_pop(&stk); num = stack_pop(&stk); if(opr == '+') { stack_push(&stk, num + num1); } else // - 减法 stack_push(&stk, num - num1); } stack_push(&stk, *p_ch); //再把当前符号放在栈里 } else if(*p_ch == '*' || *p_ch == '/') { num = stack_pop(&stk); num1 = *(p_ch + 1) - '0'; if(*p_ch == '*') { stack_push(&stk, num * num1); } else stack_push(&stk, num / num1); p_ch++; } else { if(stack_size(&stk) == 3) { num1 = stack_pop(&stk); opr = stack_pop(&stk); num = stack_pop(&stk); if(opr == '+') { stack_push(&stk, num + num1); } else stack_push(&stk, num - num1); } break; } p_ch++; } if(stack_size(&stk) == 1) { printf("结果是%d\n", stack_pop(&stk)); } stack_deinit(&stk); return 0;}
0 0
- 【数据结构】顺序栈 Stack
- 数据结构-06 栈Stack
- 【数据结构】栈 Stack
- 数据结构复习 - 栈Stack
- 栈(stack )数据结构
- 【数据结构】栈stack
- 数据结构基础:栈(Stack)
- C#数据结构--栈Stack
- 数据结构之栈stack
- 数据结构:栈(linked-stack & array-stack)
- 基本数据结构之栈(stack)
- Java 数据结构之 Stack(栈)
- 基本数据结构:栈(stack)
- 155:Min Stack【栈】【数据结构】
- 基本数据结构:栈(stack)
- 数据结构与算法---栈(stack)
- JavaScript数据结构之--------栈(Stack)
- 基本数据结构:栈(stack)
- PAT乙级1044
- 大数据技术--kafka和flume的对比
- Oralce数据库之存储过程、存储函数、触发器和数据字典
- 封装--Java基础037
- 图论(一)基本概念
- 【数据结构】栈stack
- Adapter模式
- NO.5_448. Find All Numbers Disappeared in an Array
- vi编辑器的全部概览
- 关于Activity向Fragment传值的问题
- java多态之运行时多态和编译时多态
- POJ 2251 Dungeon Master(BFS三维解)
- ORB-SLAM: A Versatile and Accurate Monocular SLAM Syetem 讲解 3
- D3D11地形渲染教程八之ColorMap(颜色贴图)