数据结构第一次作业第二题(中缀表达式转化)

在这里插入图片描述
数组栈

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

typedef struct stack
{
    int top;
    char data[31];
} Stack;

typedef struct stack_num
{
    int top;
    float data[31];
} Stack_num;

void push(Stack *S, char x)
{
    if (S->top < 30)
    {
        S->data[++S->top] = x;
    }
    return;
}

void push_num(Stack_num *S, float x)
{
    if (S->top < 30)
    {
        S->data[++S->top] = x;
    }
    return;
}

char pop(Stack *S)
{
    if (S->top == -1)
    {
        return 0;
    }
    else
    {
        return S->data[S->top--];
    }
}

float pop_num(Stack_num *S)
{
    if (S->top != -1)
    {
        return S->data[S->top--];
    }
    return 0;
}

int main()
{
    Stack *S = (Stack *)malloc(sizeof(Stack));
    S->top = -1;
    char a[31];
    char b[31];
    gets(a);
    char temp;
    int i = 0, run = 0;
    while (a[i])
    {
        if (a[i] >= '0' && a[i] <= '9')
        {
            b[run++] = a[i];
            i++;
            continue;
        }
        if (S->top == -1)
        {
            push(S, a[i]);
        }
        else if (a[i] == '+' || a[i] == '-')
        {
            temp = S->data[S->top];
            while (temp != '(' && temp != 0)
            {
                temp = pop(S);
                if (temp != '(' && temp != ')' && temp != 0)
                    b[run++] = temp;
            }
            push(S, a[i]);
        }
        else if (a[i] == '*' || a[i] == '/')
        {
            temp = S->data[S->top];
            while (temp != 0 && temp != '(' && temp != '+' && temp != '-')
            {
                temp = pop(S);
                if (temp != 0 && temp != '(' && temp != ')')
                    b[run++] = temp;
            }
            push(S, a[i]);
        }
        else if (a[i] == '(')
            push(S, a[i]);
        else if (a[i] == ')')
        {
            temp = S->data[S->top];
            while (temp != 0 && temp != '(')
            {
                temp = pop(S);
                if (temp != 0 && temp != '(' && temp != ')')
                    b[run++] = temp;
            }
        }
        i++;
    }
    while (S->top != -1)
    {
        temp = pop(S);
        if (temp != 0 && temp != '(' && temp != ')')
        {
            b[run++] = temp;
        }
    }
    Stack_num *s = (Stack_num *)malloc(sizeof(Stack_num));
    s->top = -1;
    for (int k = 0; k < run; k++)
    {
        if (b[k] >= '0' && b[k] <= '9')
        {
            push_num(s, b[k] - '0');
        }
        else
        {
            float A = pop_num(s);
            float B = pop_num(s);
            if (b[k] == '+')
            {
                push_num(s, A + B);
            }
            else if (b[k] == '*')
            {
                push_num(s, A * B);
            }
            else if (b[k] == '/')
            {
                push_num(s, B / A);
            }
            else if (b[k] == '-')
            {
                push_num(s, B - A);
            }
        }
    }
    printf("%.2f\n", pop_num(s));
    for (int k = 0; k < run - 1; k++)
    {
        printf("%c ", b[k]);
    }
    printf("%c", b[run - 1]);
    return 0;
}

正确的链表栈

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

typedef struct Node
{
    char data;
    struct Node *next;
} LinkStack;

typedef struct stack
{
    float data[31];
    int top;
} Stack_num;

void push(LinkStack *S, char x);
char pop(LinkStack *S);
void push_num(Stack_num *S, float x);
float pop_num(Stack_num *S);
int Judge(int flag, char option);

int main()
{
    LinkStack *Stack = (LinkStack *)malloc(sizeof(LinkStack));
    Stack->next = NULL;
    char a[31];
    char b[31];
    gets(a);
    int i = 0, run = 0;
    while (a[i])
    {
        if (a[i] >= '0' && a[i] <= '9')
        {
            b[run++] = a[i];
            i++;
            continue;
        }
        while (!(Stack->next == NULL) && Judge(0, a[i]) < Judge(1, Stack->next->data))
            b[run++] = pop(Stack);
        if ((Stack->next == NULL))
        {
            push(Stack, a[i]);
            i++;
            continue;
        }
        else if (Judge(0, a[i]) > Judge(1, Stack->next->data))
        {
            push(Stack, a[i]);
        }
        else if (Judge(0, a[i]) == Judge(1, Stack->next->data))
        {
            pop(Stack);
        }
        i++;
    }
    while ((Stack->next != NULL))
    {
        b[run++] = pop(Stack);
    }
    b[run] = '\0';
    Stack_num *S = (Stack_num *)malloc(sizeof(Stack_num));
    S->top = -1;
    for (int k = 0; k < run; k++)
    {
        if (b[k] != '+' && b[k] != '-' && b[k] != '*' && b[k] != '/')
        {
            push_num(S, b[k] - '0');
        }
        else
        {
            float A = pop_num(S);
            float B = pop_num(S);
            //			printf("A=%f",A);
            //			printf("B=%f",B);
            if (b[k] == '+')
            {
                float put = A + B;
                push_num(S, put);
            }
            else if (b[k] == '-')
            {
                float put = B - A;
                push_num(S, put);
            }
            else if (b[k] == '*')
            {
                float put = A * B;
                push_num(S, put);
            }
            else if (b[k] == '/')
            {
                float put = B / A;
                push_num(S, put);
            }
        }
    }

    float print = pop_num(S);
    printf("%.2f\n", print);
    for (int o = 0; o < run - 1; o++)
    {
        printf("%c ", b[o]);
    }
    printf("%c", b[run - 1]);
    return 0;
}

void push(LinkStack *S, char x)
{
    LinkStack *p = (LinkStack *)malloc(sizeof(LinkStack));
    p->data = x;
    p->next = NULL;
    p->next = S->next;
    S->next = p;
}

char pop(LinkStack *S)
{
    if ((S->next != NULL))
    {
        LinkStack *temp = S->next;
        S->next = temp->next;
        char save = temp->data;
        free(temp);
        return save;
    }
    else
    {
        return '0';
    }
}

void push_num(Stack_num *S, float x)
{
    if (S->top + 1 < 31)
    {
        S->data[++S->top] = x;
    }
    else
    {
        return;
    }
}

float pop_num(Stack_num *S)
{
    if (S->top == -1)
    {
        return -1;
    }
    else
    {
        return S->data[S->top--];
    }
}

int Judge(int flag, char option)
{
    if (flag)
    {
        switch (option)
        {
        case '+':
            return 3;
        case '-':
            return 3;
        case '*':
            return 5;
        case '/':
            return 5;
        case '(':
            return 1;
        case ')':
            return 6;
        }
    }
    else
    {
        switch (option)
        {
        case '+':
            return 2;
        case '-':
            return 2;
        case '*':
            return 4;
        case '/':
            return 4;
        case '(':
            return 6;
        case ')':
            return 1;
        }
    }
}

逻辑运算版本

#include <stdio.h>
#include <stdlib.h>
#define maxsize 100
typedef struct Stack
{
    char data[maxsize];
    double numb[maxsize];
    int top;
    int bottom;
} Stack, *Pstack;

double getnum(char a, double b, double c);
void pop(Pstack s);
void push(Pstack s, char b);
void push2(Pstack s, double num);

int main()
{
    double num;
    char a[60];
    char b[60];
    for (int m = 0; m < 60; m++)
    {
        a[m] = b[m] = 0;
    }
    gets(a);
    //scanf("%s", a);
    Pstack f = (Pstack)malloc(sizeof(Stack));
    f->top = f->bottom = 0;
    int p = 0, q = 0;
    while (a[p] != 0)
    {
        if (a[p] >= '0' && a[p] <= '9')
        {
            b[q] = a[p];
            q++;
        }
        else
        {
            if (f->top == 0)
            {
                //f->top++;
                push(f, a[p]);
            }
            else
            {
                if (a[p] == '(')
                {
                    push(f, a[p]);
                }
                else if (a[p] == '+' || a[p] == '-')
                {
                    while (f->top != 0 && f->data[f->top] != '(')
                    {
                        b[q] = f->data[f->top];
                        q++;
                        pop(f);
                    }
                    push(f, a[p]);
                }
                else if (a[p] == '*' || a[p] == '/')
                {
                    while ((f->top != 0) && f->data[f->top] != '(' && f->data[f->top] != '+' && f->data[f->top] != '-')
                    {
                        b[q] = f->data[f->top];
                        q++;
                        pop(f);
                    }
                    push(f, a[p]);
                }
                else if (a[p] == ')')
                {
                    while (f->data[f->top] != '(')
                    {
                        b[q] = f->data[f->top];
                        q++;
                        pop(f);
                    }
                    pop(f);
                }
            }
        }
        p++;
    }
    while (f->top != 0)
    {
        b[q] = f->data[f->top];
        pop(f);
        q++;
    }

    Pstack s = (Pstack)malloc(sizeof(Stack));
    s->top = s->bottom = 0;
    int i = 0;
    while (b[i] != 0)
    {
        if (b[i] >= '0' && b[i] <= '9')
        {
            push2(s, b[i] - 48);
            num=b[i]-48;
        }
        else
        {
            num = getnum(b[i], s->numb[s->top], s->numb[s->top - 1]);
            pop(s);
            pop(s);
            push2(s, num);
        }
        i++;
    }
    printf("%.2lf\n", num);
    int m = 0;
    while (b[m] != 0)
    {
        printf("%c ", b[m]);
        m++;
    }
    return 0;
}
double getnum(char a, double b, double c)
{
    if (a == '+')
    {
        return c + b;
    }
    else if (a == '-')
    {
        return c - b;
    }
    else if (a == '*')
    {
        return b * c;
    }
    else if (a == '/')
    {
        return c / b;
    }
}
void pop(Pstack s)
{
    s->top--;
}
void push(Pstack s, char b)
{
    s->top++;
    s->data[s->top] = b;
}
void push2(Pstack s, double num)
{
    s->top++;
    s->numb[s->top] = num;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值