后缀表达式c语言,后缀表达式的栈实现(C语言)

中缀表达式转为后缀表达式:

1.遇到操作数:直接输出(添加到后缀表达式中)

2.栈为空时,遇到运算符,直接入栈

3.遇到左括号:将其入栈

4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。

5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈

6.最终将栈中的元素依次出栈,输出。

计算后缀表达式:

1.如果是操作数,则放入栈中

2.如果是操作符,则取出栈中两个操作数,进行运算后,将结果放入栈中;

3.直到最后栈中只有一个元素,此元素就是计算结果;

C语言实现:

stack.h

#ifndef _STACK_H

#define _STACK_H

struct StackRecord;

typedef struct StackRecord *Stack;

typedef int ElementType;

int IsEmpty(Stack S);

int IsFull(Stack S);

Stack CreateStack(int MaxElements);

void Free_Stack(Stack S);

void MakeEmpty(Stack S);

void Push(ElementType X, Stack S);

ElementType Top(Stack S);

void Pop(Stack S);

ElementType TopAndPop(Stack S);

#endif // _STACK_H

stack.c

#include

#include

#include "stack.h"

#define EmptyTOS (-1)

#define MinStackSize (1)

struct StackRecord

{

int Capacity;

int TopOfStack;

ElementType *Array;

};

Stack CreateStack(int MaxElements)

{

Stack S;

if(MaxElements < MinStackSize)

printf("Stack Size is too small!\n");

S = malloc(sizeof(struct StackRecord));

if(S == NULL)

printf("Out of Space, malloc Stack S failed\n");

S->Array = malloc(sizeof(ElementType)*MaxElements);

if(S->Array == NULL)

printf("Out of Space, malloc S->Array failed\n");

S->Capacity = MaxElements;

return S;

}

void Free_Stack(Stack S)

{

if(S != NULL)

{

free(S->Array);

free(S);

}

}

int IsEmpty(Stack S)

{

return S->TopOfStack == EmptyTOS;

}

int IsFull(Stack S)

{

return S->TopOfStack == S->Capacity - 1;

}

void MakeEmpty(Stack S)

{

S->TopOfStack = EmptyTOS;

}

void Push(ElementType X, Stack S)

{

if(IsFull(S))

printf("Stack S is full\n");

else

S->Array[++S->TopOfStack] = X;

}

ElementType Top(Stack S)

{

if(IsEmpty(S))

{

printf("Stack S is Empty\n");

return -1;

}

else

return S->Array[S->TopOfStack];

}

void Pop(Stack S)

{

if(IsEmpty(S))

printf("Stack S is Empty\n");

else

S->TopOfStack--;

}

ElementType TopAndPop(Stack S)

{

if(IsEmpty(S))

{

printf("Stack S is Empty\n");

return -1;

}

else

return S->Array[S->TopOfStack--];

}

main.c

#include

#include

#include

#include "stack.h"

int IsOperator(char ch)

{

char ops[] = "+-*/";

int i;

for (i = 0; i < 4; i++)

{

if (ch == ops[i])

return 1;

}

return 0;

}

int Precedence(char op)

{

if (op == '(')

{

return -1;

}

else if(op == '*' || op == '/')

return 1;

else if(op == '+' || op == '-')

return 0;

}

void InFixtoPostFix(char *InFix, char *PostFix)

{

int length = 0;

int i = 0;

int j = 0;

length = strlen(InFix);

Stack Experssion = CreateStack(length);

MakeEmpty(Experssion);

for(i = 0; i < length; i++)

{

if(InFix[i] == '(')

Push(InFix[i],Experssion);

else if(InFix[i] == ')')

{

while(Top(Experssion) != '(')

PostFix[j++] = TopAndPop(Experssion);

Pop(Experssion);

}

else

{

if(!IsOperator(InFix[i]))

PostFix[j++] = InFix[i];

else

{

while(IsEmpty(Experssion) == 0 && (Precedence(Top(Experssion))>=Precedence(InFix[i])))

PostFix[j++] = TopAndPop(Experssion);

Push(InFix[i],Experssion);

}

}

}

while(IsEmpty(Experssion) == 0)

PostFix[j++] = TopAndPop(Experssion);

Free_Stack(Experssion);

PostFix[j] = 0;

}

int Calcute(char *PostFix)

{

int length = strlen(PostFix);

int i = 0;

int tmp_var = 0;

int result_var = 0;

Stack Calcute_stack = CreateStack(length);

MakeEmpty(Calcute_stack);

for(i = 0; i < length; i++)

{

if(IsOperator(PostFix[i]))

{

switch(PostFix[i])

{

case '+':

tmp_var = TopAndPop(Calcute_stack) + TopAndPop(Calcute_stack);

break;

case '-':

tmp_var = TopAndPop(Calcute_stack) - TopAndPop(Calcute_stack);

break;

case '*':

tmp_var = TopAndPop(Calcute_stack) * TopAndPop(Calcute_stack);

break;

case '/':

tmp_var = TopAndPop(Calcute_stack) / TopAndPop(Calcute_stack);

break;

}

Push(tmp_var,Calcute_stack);

}

else

{

Push(PostFix[i] - '0',Calcute_stack);

}

}

result_var = Top(Calcute_stack);

Free_Stack(Calcute_stack);

return result_var;

}

int main()

{

char InFix[100];

char PostFix[100];

int Result = 0;

while(1)

{

printf("please enter an expression: ");

gets(InFix);

printf("Infix is : %s \n",InFix);

InFixtoPostFix(InFix,PostFix);

printf("PostFix is : %s \n",PostFix);

Result = Calcute(PostFix);

printf("calculation is : %d \n",Result);

}

return 0;

}

中缀表达式转为后缀表达式的结果

0e625097cb970a284e6518360ed41342.png

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中缀表达式后缀表达式是一个很常见的问题,可以用实现。具体步骤如下: 1. 初始化一个和一个空的输出字符串。 2. 从左到右扫描中缀表达式的每一个元素。 3. 如果遇到操作数,直接将其添加到输出字符串中。 4. 如果遇到左括号,将其压入中。 5. 如果遇到右括号,将中的元素依次弹出并添加到输出字符串中,直到遇到左括号。注意,左括号不会被添加到输出字符串中。 6. 如果遇到操作符,比较其与顶操作符的优先级。如果顶操作符优先级高,将其弹出并添加到输出字符串中。然后重复比较新的顶操作符与该操作符的优先级,直到为空或顶操作符优先级低于该操作符。最后将该操作符压入中。 7. 重复步骤2-6,直到扫描完整个中缀表达式。 8. 将中剩余的操作符依次弹出并添加到输出字符串中。 下面是一个用C语言实现的中缀表达式后缀表达式的函数: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAX_LEN 100 typedef struct { int top; char data[MAX_LEN]; } Stack; void push(Stack *s, char c) { if (s->top == MAX_LEN - 1) { printf("Stack is full!\n"); exit(1); } s->top++; s->data[s->top] = c; } char pop(Stack *s) { if (s->top == -1) { printf("Stack is empty!\n"); exit(1); } char c = s->data[s->top]; s->top--; return c; } char peek(Stack *s) { if (s->top == -1) { printf("Stack is empty!\n"); exit(1); } return s->data[s->top]; } int is_operator(char c) { if (c == '+' || c == '-' || c == '*' || c == '/') { return 1; } return 0; } int precedence(char c) { if (c == '+' || c == '-') { return 1; } else if (c == '*' || c == '/') { return 2; } return 0; } void infix_to_postfix(char *infix, char *postfix) { Stack s; s.top = -1; int len = strlen(infix); int j = 0; for (int i = 0; i < len; i++) { char c = infix[i]; if (isdigit(c)) { postfix[j++] = c; } else if (is_operator(c)) { while (s.top != -1 && is_operator(peek(&s)) && precedence(peek(&s)) >= precedence(c)) { postfix[j++] = pop(&s); } push(&s, c); } else if (c == '(') { push(&s, c); } else if (c == ')') { while (peek(&s) != '(') { postfix[j++] = pop(&s); } pop(&s); } } while (s.top != -1) { postfix[j++] = pop(&s); } postfix[j] = '\0'; } int main() { char infix[MAX_LEN]; char postfix[MAX_LEN]; printf("Enter infix expression: "); fgets(infix, MAX_LEN, stdin); infix_to_postfix(infix, postfix); printf("Postfix expression: %s\n", postfix); return 0; } ``` 输入输出示例: ``` Enter infix expression: 2+3*4 Postfix expression: 234*+ ``` ``` Enter infix expression: (2+3)*4 Postfix expression: 23+4* ``` ``` Enter infix expression: 2*(3+4)-5/6 Postfix expression: 234+*56/- ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值