03 顺序栈

实现计算器,但出了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;
}
posted @ 2023-10-03 22:42  被占用的小海海  阅读(6)  评论(0编辑  收藏  举报