数据结构中用栈实现表达式求值(c语言实现)

/*
该程序完成了个位数的各类表达式求值
运用了数据结构中的栈及对栈操作的各类函数,操作全用指针完成
如输入 2+3*(3+3*1)#  输出结果为 20
经测试个位数的表达式运算结果均正确
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define STACK_INIT_SIZE 1000
typedef struct             //建造一个空栈
{
 char *base;
 char *top;
 int stacksize;
}SqStack;
int InitStack(SqStack *s)       //给栈分配空间,初始化栈
{
    (*s).base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
    if(!((*s).base))
        exit(0);
    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;
    return 1;
}
int Push(SqStack *s,char *ch)    //把接收到的第一个元素压入栈
{
  if(s->top-s->base>=STACK_INIT_SIZE)
    return 0;
     *((*s).top)=*ch;
    (*s).top++;
    return 1;
}
void  Pop(SqStack *s,char *ch){      //删除栈顶元素
    s->top--;
*ch=*(s->top);
}
char* Gettop(SqStack *s)            //得到栈顶元素
{
 if(s->top!=s->base)


    return (*s).top-1;
}
int In(char *c)          //判断吸收的数据是不是字符
{
    switch(*c)
    {
    case'+':
    case'-':
    case'*':
    case'/':
    case'(':
    case')':
    case'#':return 1;
    default:return 0;
    }
}
char *Operate(char *a,char *theta,char *b)   //弹出栈的元素进行运算
{
   char *c;
   *a=*a-48;
   *b=*b-48;
   c=(char *)malloc(sizeof(char));
    switch(*theta)
    {
    case'+':
        *c=*a+*b+48;
        break;
    case'-':
        *c=*a-*b+48;
        break;
    case'*':
        *c=(*a)*(*b)+48;
        break;
    case'/':*c=(*a)/(*b)+48;break;
    }
    return c;
}
char Precede(char *ch1,char *ch2)     //判断运算符的先后顺序
{
     if(*ch1=='+')
     {
     if(*ch2=='+')return '>';
     if(*ch2=='-')return '>';
     if(*ch2=='*')return '<';
     if(*ch2=='/')return '<';
     if(*ch2=='(')return '<';
     if(*ch2==')')return '>';
     if(*ch2=='#')return '>';
     }
     if(*ch1=='-')
     {
     if(*ch2=='+')return '>';
     if(*ch2=='-')return '>';
     if(*ch2=='*')return '<';
     if(*ch2=='/')return '<';
     if(*ch2=='(')return '<';
     if(*ch2==')')return '>';
     if(*ch2=='#')return '>';
     }
     if(*ch1=='*')
     {
     if(*ch2=='+')return '>';
     if(*ch2=='-')return '>';
     if(*ch2=='*')return '>';
     if(*ch2=='/')return '>';
     if(*ch2=='(')return '<';
     if(*ch2==')')return '>';
     if(*ch2=='#')return '>';
     }
          if(*ch1=='/')
     {
     if(*ch2=='+')return '>';
     if(*ch2=='-')return '>';
     if(*ch2=='*')return '>';
     if(*ch2=='/')return '>';
     if(*ch2=='(')return '<';
     if(*ch2==')')return '>';
     if(*ch2=='#')return '>';
     }
          if(*ch1=='(')
     {
     if(*ch2=='+')return '<';
     if(*ch2=='-')return '<';
     if(*ch2=='*')return '<';
     if(*ch2=='/')return '<';
     if(*ch2=='(')return '<';
     if(*ch2==')')return '=';
     }
          if(*ch1==')')
     {
     if(*ch2=='+')return '>';
     if(*ch2=='-')return '>';
     if(*ch2=='*')return '>';
     if(*ch2=='/')return '>';
     if(*ch2==')')return '>';
     if(*ch2=='#')return '>';
     }
     if(*ch1=='#')
     {
     if(*ch2=='+')return '<';
     if(*ch2=='-')return '<';
     if(*ch2=='*')return '<';
     if(*ch2=='/')return '<';
     if(*ch2=='(')return '<';
     if(*ch2=='#')return '=';
     }
}
int main()
{
    char *theta,*ch,*x,*c;
    char *a,*b;
    SqStack OPND;
    SqStack OPTR;
    InitStack(&OPND);    //创作一个存数字的栈
    InitStack(&OPTR);     //创作一个存运算符和括号的栈
    c=(char *)malloc(sizeof(char));   //分配内存
    ch=(char *)malloc(sizeof(char));
    x=(char *)malloc(sizeof(char));
    theta=(char *)malloc(sizeof(char));
    a=(char *)malloc(sizeof(char));
    b=(char *)malloc(sizeof(char));
    *c='#';
    Push(&OPTR,c);
    printf("请输入以#结尾的表达式\n");
    *ch=getchar();
    while((*ch)!='#'||(*(Gettop(&OPTR)))!='#'){  //运算结束停止条件
        if(!In(ch)){
            Push(&OPND,ch);
            printf("压入OPND栈  %d\n",*ch);
            *ch=getchar();
        }
        else
            switch(Precede(Gettop(&OPTR),ch))     //通过比较接收的字符来进行运算
        {
         case'<':
         Push(&OPTR,ch);
         printf("压入OPTR栈   %c\n",*ch);
         *ch=getchar();
         break;
         case'>':
         Pop(&OPTR,theta);
         printf("压入前%d %d\n",*b,*a);
         Pop(&OPND,b);
         Pop(&OPND,a);
         printf("删除后OPND的头%d %d\n",*b,*a);
         Push(&OPND,Operate(a,theta,b));
         printf("运算后 %d\n",*theta);
         break;
         case'=':
            Pop(&OPTR,x);
            *ch=getchar();
            break;}
    }
    printf("\n\n\n");
    printf("运算结果= %d",(*Gettop(&OPND)-48));
}
下面是一个基于表达式求值C语言代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义结构体 typedef struct stack { int top; // 顶指针 int* data; // 数据 } Stack; // 初始化 Stack* initStack(int size) { Stack* s = (Stack*)malloc(sizeof(Stack)); s->top = -1; s->data = (int*)malloc(size * sizeof(int)); return s; } // 判断是否为空 int isEmpty(Stack* s) { return s->top == -1; } // 入 void push(Stack* s, int val) { s->top++; s->data[s->top] = val; } // 出 int pop(Stack* s) { int val = s->data[s->top]; s->top--; return val; } // 获取顶元素 int peek(Stack* s) { return s->data[s->top]; } // 获取操作符优先级 int getPriority(char op) { if (op == '*' || op == '/') { return 2; } else if (op == '+' || op == '-') { return 1; } else { return 0; } } // 计算表达式 int calculate(int a, int b, char op) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; default: return 0; } } // 表达式求值 int evaluate(char* expression) { int len = strlen(expression); Stack* numStack = initStack(len); Stack* opStack = initStack(len); for (int i = 0; i < len; i++) { char ch = expression[i]; if (ch >= '0' && ch <= '9') { int num = ch - '0'; while (i + 1 < len && expression[i + 1] >= '0' && expression[i + 1] <= '9') { num = num * 10 + (expression[i + 1] - '0'); i++; } push(numStack, num); } else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') { while (!isEmpty(opStack) && getPriority(ch) <= getPriority(peek(opStack))) { int b = pop(numStack); int a = pop(numStack); char op = pop(opStack); push(numStack, calculate(a, b, op)); } push(opStack, ch); } else if (ch == '(') { push(opStack, ch); } else if (ch == ')') { while (peek(opStack) != '(') { int b = pop(numStack); int a = pop(numStack); char op = pop(opStack); push(numStack, calculate(a, b, op)); } pop(opStack); } } while (!isEmpty(opStack)) { int b = pop(numStack); int a = pop(numStack); char op = pop(opStack); push(numStack, calculate(a, b, op)); } int result = pop(numStack); free(numStack->data); free(numStack); free(opStack->data); free(opStack); return result; } int main() { char expression[100]; printf("请输入表达式:"); scanf("%s", expression); printf("表达式的计算结果为:%d\n", evaluate(expression)); return 0; } ``` 这个代码使用两个,一个用来存储操作数,一个用来存储操作符。具体实现过程中,遇到数字则入操作数,遇到操作符则与操作符顶元素比较优先级,如果大于或等于则将该操作符入,否则将操作符顶元素出,与操作数顶的两个元素进行计算,将结果入操作数,直到当前操作符可以入。如果表达式扫描完毕,操作符中还有元素,则依次取出操作符和操作数进行计算,直到操作符为空。最终操作数中只有一个元素,即为表达式的计算结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值