栈的表达式求解 只需把printf_s(vs推荐)改成printf就可以再其他上面运行

#include <iostream>
#include <Windows.h>
#include <string>
#include <sstream>


/***************内存检测区*********************/
#define _CRTDBG_MAP_ALLOC    //*    这个是  相当于一种开关  打开这个内存检测的开关

#include <cstdlib>   //*
#include <crtdbg.h>  //*

#ifdef  _DEBUG         //*
#ifndef DBG_NEW           //*
#define DBG_NEW new (_NORMAL_BLOCK, __FILE__, __LINE__)//*
#define new DBG_NEW        //*
#endif               //*
#endif 

/***************宏定义和类型转换区*****************/
#define MAX_SIZE 128
#define STACK_S typedef

#define ELEM_TYPE int

using namespace std;

/***************结构体区*********************/
STACK_S struct stack_s {

    ELEM_TYPE* base;  // 栈底标记
    ELEM_TYPE* top;      // 栈顶元素

}stack;

static int DeBug = 1;

/***************函数定义区*********************/
bool isEmpty(stack& st);
bool isFull(stack& st);

// 1.初始化栈
bool initStack(stack& st);
// 2.入栈    e是要入栈的元素
bool pushStack(stack& st, ELEM_TYPE e);
// 3.出栈   e是要出栈的元素
bool popStack(stack& st, ELEM_TYPE& e);
// 4.销毁栈
void destroyStack(stack& st);
// 5.栈的遍历
void printStack(stack& st);
// 6.栈的长度
int stackLen(stack& st);
// 7.得到栈顶的指针
ELEM_TYPE* getTop(stack& st);

/***************有关运算式子的函数声明区*******************/

// 判断是否为 运算符
bool isOpt(int a, char *optstr, int lenth);

// 运算符优先级的比较  左大于右 就返回 >   等于的话 就放回 =   否则返回 <
char priority(char lopt, char ropt);

// 计算函数
void oper(ELEM_TYPE outvalue_1, char outopt, ELEM_TYPE outvalue_2, ELEM_TYPE& result);


/***************用户接口区*********************/
int main(void) {

    const char* str = "  16*16*(1+1)+8 =";
    char optstr[] = { '+', '-', '*', '/', '(', ')', '#', '='};

    stack opt;    // 这个是符号栈
    stack value;  // 这个式值栈

    initStack(opt);
    initStack(value);

    pushStack(opt, (int)('#'));        //做一个开始的标记  与第一个进来的相互比较
    ELEM_TYPE result = 0;    //结果   //以为value 内部也是  char 类型
    char buf[128];
    int len = 0;
    char* start = nullptr;
    char* end = nullptr;
    char intbuf[16];

    cout << "***********************************************" << endl; //
    while ((char)(*getTop(opt)) != '#' || str[len] != '=') {

        if (isspace(str[len])) {
            if (DeBug)printf_s("第 %d 个为空!\n", len + 1);
            len++;
            continue;
        }
        ELEM_TYPE ret = (ELEM_TYPE)str[len];    //保存当前读取的  字符
        ELEM_TYPE outvalue_1, outvalue_2;    //用来保存出栈的值
        ELEM_TYPE outopt;
        
        if (!isOpt(ret, optstr, sizeof(optstr) / sizeof(optstr[0]))) {    //不是运算符的话就是  数值

            {// 这个模块是把  连续的 数字字符 转换成 int
                start = (char*)str + len;
                end = start + 1;
                while (!isOpt(int(*end), optstr, sizeof(optstr) / sizeof(optstr[0]))) {
                    end++;
                }
                snprintf(intbuf, sizeof(intbuf), start, end - start);
                ret = atoi(intbuf);
            }
            
            if (DeBug)printf_s("第 %d 个为数字: %d!\n", len + 1, ret);                                                        //入栈之后就继续扫描
            pushStack(value, ret);
            len += end-start;
            continue;
        }else {
            if (DeBug)printf_s("第 %d 个为运算符,正在进行操作 %c !\n", len + 1, (char)ret);

            switch (priority((char)(*getTop(opt)), (char)ret))
            {
            case '<':
                pushStack(opt, ret);
                if (DeBug)printf_s("第 %d 个为运算符,入栈 %c !\n", len + 1, ret);
                len++;
                break;
            case '>':
                popStack(opt, outopt);
                popStack(value, outvalue_1);
                popStack(value, outvalue_2);
                oper(outvalue_2, (char)outopt, outvalue_1, result);  //开始运算
                pushStack(value, result);
                if (DeBug)printf_s("**********结果 %d 入栈   %c 出栈!\n", result, outopt);
                break;
            case '=':
                popStack(opt, outopt);
                if (DeBug)printf_s(" ‘=’的情况下 %c 出栈!\n", outopt);
                len++;
                break;
            }
        }
    }

    const char* laopo = "珂珂宝贝1314";
    cout << "开始输出结果!" << endl;
    sprintf_s(buf, "%s %d ", str, *getTop(value));
    cout << buf << endl;

    Sleep(4000);
    cout << "等等, 答案好像不对 !" << endl;
    Sleep(4000);
    sprintf_s(buf, "%s %d%s ", str, *getTop(value), laopo);

    cout << "应该是  :";
    cout << buf << endl;
    

    destroyStack(opt);
    destroyStack(value);
    
    system("pause");
    _CrtDumpMemoryLeaks();
    return 0;
}

/***************函数定义区*********************/
bool initStack(stack& st) {
    st.base = new ELEM_TYPE[MAX_SIZE];
    if (!st.base) {
        return false;
    }
    st.top = st.base;
    return true;
}

bool pushStack(stack& st, ELEM_TYPE e) {
    if ((st.top - st.base) == MAX_SIZE) {//栈已经满了
        return false;
    }
    *(st.top++) = e;
    return true;
}

bool popStack(stack& st, ELEM_TYPE& e) {
    if (st.base == st.top) {//栈为空
        return false;
    }
    e = *(--st.top);
    return true;
}

void destroyStack(stack& st) {

    st.top = nullptr;

    if (st.base) delete[] st.base;

    return;
}

inline bool isEmpty(stack& st) {
    if (st.base == st.top) {
        return true;
    }
    else {
        return false;
    }
}

inline bool isFull(stack& st) {

    if (st.top - st.base == MAX_SIZE) {
        return true;
    }
    else {
        return false;
    }
}

void printStack(stack& st) {
    auto tmp = st.base;
    int i = 1;
    while (tmp != st.top) {
        printf_s(" %c       \n", *tmp);
        tmp++;
    }
    return;
}

inline int stackLen(stack& st) {
    auto len = st.top - st.base;
    return len;
}

inline ELEM_TYPE* getTop(stack& st) {
    if (!isEmpty(st)) {
        return st.top - 1;
    }
    else
        return nullptr;
}

bool isOpt(int a, char* optstr, int lenth) {

    for (int i = 0; i < lenth; i++) {
        if ((char)a == optstr[i])
            return true;
    }
    return false;
}

char priority(char lopt, char ropt) {
    switch (lopt) 
    {
    case '+':
        switch (ropt)
        {
        case '=':
        case '+':
        case '-':
        case ')':
        case '#':
            return '>';
        default:
            return '<';
        }
        
    case '-':
        switch (ropt) 
        {
        case '=':
        case '+':
        case '-':
        case ')':
        case '#':
            return '>';
        default:
            return '<';
        }
        
    case '*':
        switch (ropt) 
        {
        case '(':
            return '<';
        default:
            return '>';
        }
        
    case '/':
        switch (ropt) 
        {
        case '(':
            return '<';
        default:
            return '>';
        }
        
    case '(':
        switch (ropt) 
        {
        case ')':
            return '=';
        default:
            return '<';
        }

    case '#':
        switch (ropt)
        {
        case '#':
        case '=':
            return '=';
        default:
            return '<';
        }
    }
    return '\0';
}

void oper(ELEM_TYPE outvalue_1, char outopt, ELEM_TYPE outvalue_2, ELEM_TYPE& result) {

    int result_1 = 0;

    int value_1 = outvalue_1;
    int value_2 = outvalue_2;
    
    switch (outopt) {
    case '+':
        result_1 = value_1 + value_2;
        break;
    case '-':
        result_1 = value_1 - value_2;
        break;
    case '*':
        result_1 = value_1 * value_2;
        break;
    case '/':
        result_1 = value_1 / value_2;
        break;
    default:
        break;
    }
    result = result_1 ;
    return;
    
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我理解你的问题了。实现表达式求解要用到一个来存储运算符和操作数,并按照一定的优先级进行计算。以下是一个示例程序,其中用到了几个重要的库函数(如stack_push、stack_pop等): ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> typedef struct { int capacity; int top; int* data; } Stack; Stack* stack_new(int capacity) { Stack* s = (Stack*)malloc(sizeof(Stack)); s->capacity = capacity; s->top = -1; s->data = (int*)malloc(capacity * sizeof(int)); return s; } void stack_push(Stack* s, int value) { if (s->top == s->capacity - 1) { fprintf(stderr, "Error: stack is full.\n"); exit(1); } s->top++; s->data[s->top] = value; } int stack_pop(Stack* s) { if (s->top == -1) { fprintf(stderr, "Error: stack is empty.\n"); exit(1); } int value = s->data[s->top]; s->top--; return value; } int stack_top(Stack* s) { if (s->top == -1) { fprintf(stderr, "Error: stack is empty.\n"); exit(1); } return s->data[s->top]; } int is_operator(char ch) { return ch == '+' || ch == '-' || ch == '*' || ch == '/'; } int operator_precedence(char op) { switch (op) { case '+': case '-': return 1; case '*': case '/': return 2; default: fprintf(stderr, "Error: unsupported operator '%c'.\n", op); exit(1); } } int evaluate_expression(char* expression) { Stack* operands = stack_new(strlen(expression)); Stack* operators = stack_new(strlen(expression)); int i = 0; while (expression[i]) { if (isdigit(expression[i])) { int value = expression[i] - '0'; i++; while (isdigit(expression[i])) { value = value * 10 + (expression[i] - '0'); i++; } stack_push(operands, value); } else if (is_operator(expression[i])) { while (!stack_top(operators)) { char op = stack_top(operators); if (operator_precedence(op) >= operator_precedence(expression[i])) { int b = stack_pop(operands); int a = stack_pop(operands); switch (op) { case '+': stack_push(operands, a + b); break; case '-': stack_push(operands, a - b); break; case '*': stack_push(operands, a * b); break; case '/': stack_push(operands, a / b); break; default: fprintf(stderr, "Error: unsupported operator '%c'.\n", op); exit(1); } stack_pop(operators); } else { break; } } stack_push(operators, expression[i]); i++; } else if (isspace(expression[i])) { i++; } else { fprintf(stderr, "Error: invalid character '%c'.\n", expression[i]); exit(1); } } while (!stack_top(operators)) { char op = stack_top(operators); int b = stack_pop(operands); int a = stack_pop(operands); switch (op) { case '+': stack_push(operands, a + b); break; case '-': stack_push(operands, a - b); break; case '*': stack_push(operands, a * b); break; case '/': stack_push(operands, a / b); break; default: fprintf(stderr, "Error: unsupported operator '%c'.\n", op); exit(1); } stack_pop(operators); } int result = stack_pop(operands); free(operands->data); free(operands); free(operators->data); free(operators); return result; } int main() { char* expression = "3 * ( 4 + 5 ) - 6 / 2"; int result = evaluate_expression(expression); printf("%s = %d\n", expression, result); return 0; } ``` 这个程序能够处理带括号的表达式,并按照正确的优先级进行计算。你可以尝试将其复制到本地环境中运行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值