栈运用 逆波兰表达式 C语言

逆波兰表达式即后缀表达式
输入逆波兰表达式输出结果
大致思路:
输入字符,注意字符与字符之间间隔,故创建缓存数组
将字符转化为浮点数后压入栈,因逆波兰表达式会将优先级表现出来,则将浮点数遇见符号进行计算即可,计算结果再压入栈等待与后面的浮点数再遇见输入的符号

#include 
#include 
#include 
//以开发的思路,在Mian函数中一步一步完善程序,有定义,声明,输入,输出等,在一步步完善
 //后缀表达式 逆波兰表达式
/**
(1-2)*(4+5) --> 1 2 - 4 5 + *  括号优先
 1 2入栈,遇运算符计算弹栈,结果入栈,4 5入栈,
 遇运算符弹栈计算,结果入栈,再遇运算符弹栈运算.

 **/
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
#define MAXBUFFER       10
typedef double ElemType;//
typedef struct
{
     ElemType *top;
    ElemType *base;
    int stacksize;//指示栈当前最大可使用容量
}sqstack;

void Initstack(sqstack *s)
{
    s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
    if(!s->base)
        exit(0);

    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;
}

void push(sqstack *s,ElemType e)
{
    if(s->top-s->base>=s->stacksize)
    {
        s->base=(ElemType *)realloc(s->base,(STACKINCREMENT+s->stacksize)*sizeof(ElemType));
        if(!s->base)
            exit(0);
        s->top=s->base+s->stacksize;
        s->stacksize=s->stacksize+STACKINCREMENT;
    }
    *(s->top)=e;
    s->top++;
}

void pop(sqstack *s,ElemType *e)
{
    if(s->top==s->base)
        return;

    *e=*--(s->top);
}
//会对栈进行修改则传地址,不修改只是做测试等操作则只传数据即可
int stackLen(sqstack s)//这里传进来的是结构不是指针
{
    return (s.top-s.base);//相减的不是地址,是地址指向元素相减
}

int main()
{
    sqstack s;
    Initstack(&s);
    char c;
    double d,e;
    int i=0;
    char str[MAXBUFFER];//对于字符及字符串,1234被认为是字符1,2,3,4,而不是数字1234, 1234 5被认为是字符1,2,3,4,空格,5,定义缓冲区若没有空格则将字符放在一起变成一个数
    printf("请输入逆波兰表达式,输入待计算数据,数据与运算符之间用空格符隔开,以#结束\n");
    scanf("%c",&c);//输入为字符型需转换
    while(c!='#')
    {
        while(isdigit(c)||c=='.')//isdigit判断传入字符是否数字,制作缓冲区,用于过滤数字
            {
                str[i++]=c;
                str[i]='\0';
                /**
                '\0'即空字符,在ascII中就是第一个Null,是判断一个字符串是否结束的标志
                字符‘0’对应的ASCII码是48

                **/
                if(i>=10)//缓冲器只定义了一个大小为10的数组
                   {
                       printf("错误,太大\n");
                       return -1;
                   }
                   scanf("%c",&c);
                if(c==' ')//遇到空格,完成一个数字的输入,转化后进行入栈操作
                {
                    d=atof(str);//把字符串转化为浮点数
                    push(&s,d);
                    i=0;
                    break;
                }

            }
        switch(c)  //可优化,把pop提到前面
        {
        case '+':
            pop(&s,&e);
            pop(&s,&d);
            push(&s,d+e);
            break;
        case '-':
             pop(&s,&e);
            pop(&s,&d);
            push(&s,d-e);
            break;
        case '*':
             pop(&s,&e);
            pop(&s,&d);
            push(&s,d*e);
            break;
        case '/':
             pop(&s,&e);
            pop(&s,&d);
            if(e!=0)
            {
                push(&s,d/e);
            }
            else
            {
                printf("错误\n");
                return -1;
            }
            break;
        }
        scanf("%c",&c);
    }
   pop(&s,&d);
   printf("最终结果为:%f\n",d);
    return 0;
}
// 5 - (6 + 7) * 8 + 9 / 4
// 5 - 13 * 8 + 9 / 4
// 5 - 104 + 2.25
// -99 + 2.25
// 5 6 7 + 8 * - 9 4 / +

你可能感兴趣的:(数据结构)