首页 > 其他分享 >03 顺序栈

03 顺序栈

时间:2023-10-03 23:04:29浏览次数:26  
标签:case 03 顺序 return int elemtype break printf

实现计算器,但出了bug,不想改了,思路没问题就行

#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#include "ctype.h" // 查查这些头文件的作用

typedef int elemtype; // 将所有的float类型都转换为elemtype ,没必要也许

// (1) 顺序栈
typedef struct Stack
{
    elemtype data[100];
    int top; // 不用base,因为base默认一直是0
} *Sqstack;

// (2)全局变量
char ch[7] = {'+', '-', '*', '/', '(', ')', '#'};
int f1[7] = {3, 3, 5, 5, 1, 6, 0};
int f2[7] = {2, 2, 4, 4, 6, 1, 0};
int n = 0;

// 初始化栈,不用额外开辟一片空间也行
void initStack(Sqstack s)
{
    s->top = 0;
}

// 入栈
void push(Sqstack s, elemtype e)
{
    // s->top++;
    s->data[s->top] = e;
    s->top++;
}

// 出栈
void pop(Sqstack s, elemtype *e)
{
    *e = s->data[s->top];
    s->top--;
}

// 获得栈顶元素
elemtype getTop(Sqstack s)
{
    return s->data[s->top-1];
}

// 判断栈是否为空
bool stackEmpty(Sqstack s)
{
    if (s->top == 0)
    {
        return true;
    }
    else
        return false;
}

// 将运算符转化为 通过获得在数组的位置-->获得优先级-->再比较优先级
elemtype cton(char c)
{
    switch (c)
    {
    case '+':
        return 0;
        break;
    case '-':
        return 1;
        break;
    case '*':
        return 2;
        break;
    case '/':
        return 3;
        break;
    case '(':
        return 4;
        break;
    case ')':
        return 5;
        break;
    case '#':
        return 6;
        break; 
        default:break;
    }
}

// 比较优先级: 通过获得在数组的位置,获得优先级,再比较优先级
char compare(char c1, char c2)
{
    int i1 = cton(c1); // 栈顶
    int i2 = cton(c2); // 当前
    if (f1[i1] > f2[i2])
    {
        return '>';
    }
    else if (f1[i1] < f2[i2])
    {
        return '>';
    }
    else
    {
        return '=';
    }
}

// 四则运算
elemtype operate(elemtype a, elemtype t, elemtype b)
{
    int result;
    switch (t)
    {
    case 0:
        result = a + b;
        break;
    case 1:
        result = a - b;
        break;
    case 2:
        result = a * b;
        break;
    case 3:
        result = a / b;
        break;
    }
    return result;
}

// ****************************************最核心的代码************************************
elemtype EvaluateExpression()
{
    Sqstack OPTR, OPND;
    initStack(OPND);
    initStack(OPTR);
    push(OPTR,cton('#'));
    printf("栈顶元素:%d\n",getTop(OPTR));
    elemtype a, t, b;
    elemtype e;   // 出栈的元素
    elemtype sum=0; // 输入的一个数字
    char c;
    c = getchar(); // 一次读取单个字符
    while (c != '#' || ch[getTop(OPTR)] !='#')
    {
        // 数字入栈就行
        if (isdigit(c)) // 数字入栈就行
        {
            sum = 0;
            
            while (isdigit(c))
            {
                sum = sum * 10 + (c - '0'); // 将字符c转化为对应的数字
                c = getchar();
            }
            push(OPND, sum);
            printf("%d:入栈成功!\n",getTop(OPND));
        }
        else
        { // 关于操作符的操作
        // printf("当前栈顶元素:");
        printf("%c\n",c);
        char temp=ch[getTop(OPTR)];
        printf("%c\n",temp);
            switch (compare(ch[getTop(OPTR)],c))
            {
                
            case '<':
                push(OPTR, cton(c));
                  printf("栈顶元素:%d\n",getTop(OPTR));
                break; // 入栈的是经过转换后的 float型数据
            case '=':
                pop(OPTR, &e);
                c = getchar();
                break;
            case '>':
                pop(OPND, &a);
                pop(OPTR, &t);
                pop(OPND, &b);
                push(OPND, operate(a,t,b));
                break;
            }
        }

    } // endwhile!
    return getTop(OPND);  // 最终的返回值
}

// 菜单
// int memu
// {

    
// }

// 四则运算,返回运算结果

// 最终结果

// 将所有类型(float,char)都转换为float类型,为了方便只写一遍栈的基本操作而已
int main()
{
        int result;
    int n;
    printf("***********************欢迎使用表达式求值小程序*************************\n");
    printf("请输入你要计算的表达式(以#结束):\n");
    do
    {
        result = EvaluateExpression();
        printf("计算结果:%f", result);
        printf("1.继续使用; 0.退出程序");
        scanf("%d", &n);
    } while (n != 0);
    printf("***********************退出程序!*************************\n");
    return 0;
}

标签:case,03,顺序,return,int,elemtype,break,printf
From: https://www.cnblogs.com/zhanjianhai/p/17741774.html

相关文章

  • stm32f103-2023-10-03
    这是当时在“某知道”上自己的一篇原创回答,由于某些原因目前个人在该平台上的所有回答或隐藏或清空了,现经删整之后收纳回本人博客。======================================================================================问题链接:https://zhidao.baidu.com/question/1604602......
  • AtCoder Grand Contest 036 F Square Constraints
    洛谷传送门AtCoder传送门本质是\(p_i\in[l_i,r_i]\)的计数问题。当\(1\lei\len\)时,\(l_i\)才可能不等于\(1\)。考虑容斥,设钦定\(m\)个不满足条件(上界为\(l_i-1\)),其余任意(上界为\(r_i\))。然后按照上界排序后dp,设\(f_{i,j}\)为考虑前\(i\)个元素,已经......
  • 数据结构之"顺序表"
    前言......
  • 202310032035_《近期撸码心得》
    如图,循环依赖一直搞糊涂我,本来,mybatis就是因sql操作灵活性而采用,无可厚非,对于新手的我,一是项目需要,而是为求职职场操练,但“请君入问”感是还要配“mybatis-generator”plugin,为了自动嘛。但是,我觉得这插件与Lombok某些生成代码严重重复......直到修修补补,到上图“推荐重新设......
  • 洛谷P5303
    这一道题跟NOIP集训模拟赛1的D题非常像,当然D题的递推方程更复杂(磁盘里面有题解pdf)对于这一道题,我们设f[i][0]表示铺了i列而且全部用的完整的砖的方案数f[i][1]表示铺了i列,但是第i列缺了一个而且第i列的唯一的那一块砖头就是1X1其中一个f[i][2]表示铺了i列,但是第i列缺了一个而且......
  • 03-共阳极数码管的静态显示
    共阳数码管的静态显示由电路图可知此为共阳数码管#include<REGX52.H>unsignedintcodenum[16]={ 0xc0, //011000000 0xf9,//111111001abged为0 0xa4,//210100100 0xb0,//3 0x99,//4 0x92,//5 0x......
  • stata 18 显示r603 不能安装外部命令 主要是设置文件夹的读写权限
    1.stata18安装位置的ado文件夹中新建plus personal ......
  • 梦断代码阅读笔记03
    1、程序员与用户的交涉读这本书,发现其实这个团队也有过交工的时候,只是仅仅在项目成员满意的情况下,而没有达到用户的预期,也就是二者沟通不充分,程序员本身并没有真正了解到用户的需求,只是按照自己认为的行事,导致了期望之间的偏差,也造成了工作量的加大,和项目的返工;这也和王老师之......
  • 第03章 Python的数据结构、函数和文件
    本章讨论Python的内置功能,这些功能本书会用到很多。虽然扩展库,比如pandas和Numpy,使处理大数据集很方便,但它们是和Python的内置数据处理工具一同使用的。我们会从Python最基础的数据结构开始:元组、列表、字典和集合。然后会讨论创建你自己的、可重复使用的Python函数。最后,会学习P......
  • 2023.10.03补题两则
    2023.10.03T2Solution在\(\bmod{2}\)意义下,\(-x^{c}=x^{c}\)。对于\(A_i\equivC\pmod{B}\),变为\(A_i-C\equiv0\pmod{B}\),那么\(-C\)操作可以看成是异或上\(C\)。对于\(A^{'}_i\equiv0\pmod{B}\)的形式,欲找到最大的\(B\),则\(B\)显然是\(\gcd\......