栈——实验及提升训练

第2关:中缀表达式转换为后缀表达式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct stack
{
    int top;
    char *head;
};

typedef struct stack* Stack;

Stack init(Stack s){
    s = (Stack)malloc(sizeof(struct stack));
    s -> top = 0;
    s -> head = (char *)malloc(sizeof(char)*85);
    return s;
}

int isEmpty(Stack s){
    if(s->top == 0) return 1;
    return 0;
}

int isFull(Stack s){
    if(s->top == 85) return 1;
    return 0;
}

void push(Stack s,char ch){
    if(!isFull(s)){
        s->head[s->top] = ch;
        s -> top ++;
    }
}

char top(Stack s){
    return s->head[s->top-1];
}

void pop(Stack s){
    
    if(!isEmpty(s)){
        s -> top --;
    }
}



int isNumber(char ch){
    if(ch<='9'&&ch>='0'){
        return 1;
    }return 0;
}

void dealRight(Stack temp){
    char ch;
    while((ch = top(temp))!='('){
        putchar(ch);
        pop(temp);
    }
}

int isAddOrSub(char ch){
    if(ch == '+'||ch=='-') return 1;
    return 0;
}



void dealHigh(Stack temp,char sign){
    char ch;
    while (!isAddOrSub(ch = top(temp))&&!isEmpty(temp)) {
        putchar(' ');
        putchar(ch);
        pop(temp);
    }

    push(temp, sign);
}

void dealLow(Stack temp,char sign){
    
    while(!isEmpty(temp)){
        putchar(' ');
        putchar(top(temp));
        pop(temp);
    }
    push(temp,sign);
}

Stack  inToPost(char *expression)
{
    unsigned long  length = strlen(expression);
    
    Stack temp = NULL;
    temp = init(temp);

    int i = 0;
    while(i!=length){
        if(isNumber(expression[i])){
            if(isNumber(expression[i-1])||isEmpty(temp))
                putchar(expression[i]);
            else{
                putchar(' ');
                putchar(expression[i]);
            }
        }
        else if(expression[i]=='(') push(temp, '(');
        else if(expression[i]==')') dealRight(temp);
        else if(isAddOrSub(expression[i])) dealLow(temp, expression[i]);
        else if(expression[i]=='*'||expression[i]=='/') dealHigh(temp,expression[i]);
        i++;
    }
    
    return temp;
}

void print(Stack s){
    while(!isEmpty(s)){
        putchar(' ');
        putchar(top(s));
        pop(s);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小蒋的学习笔记

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

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

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

打赏作者

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

抵扣说明:

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

余额充值