多项式求值——第一个方法:两个栈

多项式求值的第一个方法的基本思路就是:设定两个栈,一个栈放数字,另一个栈放符号

将表达式输入到字符数组中,

如果指针指向符号,并且该符号的优先级大于符号栈顶的优先级,那么就放进符号栈中;

如果指针指向的符号的优先级小于符号栈栈顶的优先级,那么将数字栈中pop出两个数字和符号栈中pop出的一个字符进行运算,将运算的结果放进数字栈中;

如果指针指向数字,那么就将数字放入数字栈中,再将指针指向下一个字符。

当字符数组全部输出完之后,就可以返回数字栈的栈顶元素了。

那么我们的头文件test就是栈的基本操作:

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef char STDataType;
typedef struct Stack{
    STDataType *a;
    int top;
    int capacity;
}ST;
void InitStack(ST*ps);//初始化
void PushStack(ST*ps,STDataType x);//入栈
void PopStack(ST*ps);//出栈
STDataType SatckTop(ST*ps);//返回栈顶元素
int StackEmpty(ST*ps);//判空

 

下面我们根据头文件写出对应的源文件中函数的声明:

#include"test.h"
void InitStack(ST*ps){
    ps->a=(STDataType*)malloc(sizeof(STDataType)*4);
    ps->top=0;//top指向栈顶元素的下一个位置
    ps->capacity=4;
}
void PushStack(ST*ps,STDataType x){
    assert(ps);
    ps->a[ps->top++]=x;
    if(ps->capcaity==ps->top){
        STDataType*tmp=(STDataType*)realloc(ps->a,ps->capacity*2*sizeof(STDataType));
        if(tmp==NULL)
            exit(-1);
        else{
            ps->a=tmp;
            ps->capcity*=2;
        }
    }
}
void PopStack(ST*ps){
    assert(ps);
    assert(ps->top>0);
    ps->top--;
}
STDataType StackTop(ST*ps){
    assert(ps);
    assert(ps->top>0);
    return ps->a[ps->top-1];
}
int StackEmpty(ST*ps){
    assert(ps);
    return ps->top?0:1;
}

 

下面我们来实现另一个源文件的操作:

#include"test.h"
int check(char s){//检查是否为运算符号
    if(s=='+'||s=='-'||s=='*'||s=='/'||s=='('||s==')'||s=='#')
        return 1;
    return 0;
}
char Precede(char a,char b){//判断栈顶和字符元素的优先级
    if(a=='+'){
        switch(b){
        case'+':return '>';
        case'-':return '>';
        case'*':return '<';
        case'/':return '<';
        case'(':return '<';
        case')':return '>';
        case'#':return '>';
        }
    }
    else if(a=='-'){
        switch(b){
        case'+':return '>';
        case'-':return '>';
        case'*':return '<';
        case'/':return '<';
        case'(':return '<';
        case')':return '>';
        case'#':return '>';
        }
    }
    else if(a=='*'){
        switch(b){
        case'+':return '<';
        case'-':return '<';
        case'*':return '>';
        case'/':return '>';
        case'(':return '<';
        case')':return '>';
        case'#':return '>';
        }
    }
    else if(a=='/'){
        switch(b){
        case'+':return '<';
        case'-':return '<';
        case'*':return '>';
        case'/':return '>';
        case'(':return '<';
        case')':return '>';
        case'#':return '>';
        }
    }
    else if(a=='('){
        switch(b){
        case'+':return '<';
        case'-':return '<';
        case'*':return '<';
        case'/':return '<';
        case'(':return '<';
        case')':return '=';
        case'#':return -1;
        }
    }
    else if(a==')'){//按理说不会出现这种情况
        switch(b){
        case'+':return '>';
        case'-':return '>';
        case'*':return '>';
        case'/':return '>';
        case'(':return -1;
        case'#':return '>';
        }
    }
    else if(a=='#'){
        switch(b){
        case'+':return '<';
        case'-':return '<';
        case'*':return '<';
        case'/':return '<';
        case'(':return -1;
        case')':return '<';
        case'#':return '=';
        }
    }
    return 0;
}   
char cal(char a,char b,char c){
    int m=a-'0';
    int n=b-'0';
    switch(c){
    case'+':
        return (m+n)+'0';
    case'-':
        return (m-n)+'0';
    case'*':
        return (m*n)+'0';
    case'/':
        return (m/n)+'0';
    }
    return 0;
}
int calculation(char*s){
    ST ch,num;
    char a,b,c;
    InitStack(&ch);
    InitStack(&num);
    PushSatck(&ch,'#');
    while(*s!='#'||StackTop(&ch)!='#'){
            if(!check(*s)){
                PushStack(&num,*s);
                s++;
            }
            else{
                switch(Precede(StackTop(&ch),*s)){
                case'>':
                    char a=StackTop(&num);
                    PopStack(&num);
                    char b=StackTop(&num);
                    PopStack(&num);
                    char c=StackTop(&ch);
                    PopStack(&ch);
                    PushStack(&num,cal(a,b,c);
                    break;
                case'<':
                    PushStack(&ch,*s);
                    s++;
                    break;
                case'=':
                    PopStack(&ch);
                    s++;
                    break;
                }
            }
    }
    return StackTop(&num)-'0';
}
int main(){
    char s[100]={0};//
    printf("请输入表达式:");
    scanf("%s",s);
    int result=calculation(s);
    printf("结果是:%d\n",result);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妮妮妮妮没事吧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值