【数据结构】栈stack

来源:互联网 发布:mac air 电池容量 编辑:程序博客网 时间:2024/05/17 23:59
【数据结构 - 栈】
数据结构由"一组存储区"和"相关函数"构成
每一种数据结构代表了这些存储区的管理方法
这些函数提供了这些存储区的使用方法
只有这些函数才能直接使用这些存储区

"栈"是一种数据结构
栈可以用来存放数字,栈里的数字有"前后顺序"
先放进去的数字在前,后放进去的数字在后
从栈里获得的永远是"最后一个放进去的数字"
这种使用方法叫做"后进先出"
实现栈的时候需要提供一个函数"向栈里放数字",这个函数名通常叫"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
原创粉丝点击