中缀到后缀的转换--栈实现

原创 2018年04月17日 20:59:17
#include <stdio.h>
#include <stdlib.h>
#include <Stack_Head.h>
#include <string.h>
/*
2018.4.4 栈的链表实现

*/
Stack Initial_Stack()
{
    Stack S=(Stack)malloc(sizeof(struct Node));
    S->Next=NULL;
     return S;
}
int IsEmpty(Stack S)
{


    return S->Next==NULL;
}

void Dispose_Stack(Stack S)
{
    PtrToNode P=S->Next;

    while(P!=NULL)
    {

        free(S);
        S=P;
        P=P->Next;
    }

}
void Push(Stack S,ElementType x)
{
    PtrToNode T=(PtrToNode)malloc(sizeof(struct Node));
    T->x=x;
    T->Next=S->Next;
    S->Next=T;


}

void Pop(Stack S)
{

    PtrToNode P;
    if(!IsEmpty(S))
    {
        P=S->Next;
        S->Next=P->Next;

    }
    free(P);
}
ElementType Top(Stack S)
{

    PtrToNode P;
    if(!IsEmpty(S))
    {
        P=S->Next;
       return P->x;

    }
    else
        printf("isempty!");
        exit(0);
}
int priority(char oprd)
{
    if (oprd=='(')
        return 0;
    if(oprd=='+'||oprd=='-')
        return 1;
    if(oprd=='*'||oprd=='/')
        return 2;


}
void infix_to_post()
{
    char c[100];
    scanf("%s",c);
    //Stack OPTR=Initial_Stack();// number
    Stack OPRD=Initial_Stack();//operator
    Push(OPRD,-1);
    //printf("alreading push");

    int i;
    for(i=0;i<strlen(c);i++)
    {

        if(c[i]>='a'&&c[i]<='z')
        {
            printf("%c",c[i]);

        }
        else if(c[i]=='(') //注意 如果是左括号无条件压  相当于是最高优先级  但是POP的时候 当时是最低优先级  任何时候都不出 只有当前读的是右括号才出来
        {

            Push(OPRD,c[i]);
        }
        else if(c[i]==')')
        {
            while(Top(OPRD)!='(')
            {


                    printf("%c", Top(OPRD));
                    Pop(OPRD);


            }
          Pop(OPRD);
        }
        else
        {

           //注意:只有当前的优先级大于栈顶优先级时才push  所以相等时 栈顶也要Pop出来
            while(priority(c[i])<=priority(Top(OPRD)))
            {
                char oprd = Top(OPRD);


                printf("%c",oprd);
                Pop(OPRD);
            }
            Push(OPRD,c[i]);
            //printf("alreading puch %c",c[i]);

        }
    }

    while(!IsEmpty(OPRD))
    {

        printf("%c",Top(OPRD));
        Pop(OPRD);
    }

}
int main()
{
    //printf("Hello world!\n");

   /* Stack S=Initial_Stack();
    Push(S,1);
    Push(S,2);
    Push(S,3);
    printf("%d",Top(S));
    */

    infix_to_post();
    return 0;
}

头文件

#ifndef STACK_HEAD_H_INCLUDED
#define STACK_HEAD_H_INCLUDED
typedef struct Node *PtrToNode;
#define ElementType char
typedef struct Node *Stack;

int IsEmpty(Stack S);
Stack Initial_Stack();
void Dispose_Stack(Stack S);
void Push(Stack S , ElementType x);
void Pop(Stack S);
ElementType Top(Stack S);

#endif // STACK_HEAD_H_INCLUDED
struct Node{
ElementType x;
struct Node * Next;
};



样例:

a+b*c+(d*e+f)*g
abc*+de*f+g*+
Process returned 0 (0x0)   execution time : 17.120 s
Press any key to continue.

栈及实现(C语言)以及中缀式到后缀式的转换实例

栈是一种先进后出(后进先出)的线性表,其限制是仅允许在表的一端进行插入和删除运算。 栈可以用链表实现,也可以用数组实现。 在使用链表实现时,栈顶指针指向链表的前端节点,当栈顶指针为NULL时即为空...
  • mcu_tian
  • mcu_tian
  • 2016-05-24 20:13:48
  • 1334

数据结构栈之中缀表达式转后缀

对于一个中缀表达式,假设a*b+(a+b) 我们对它从左至右进行遍历,当遇到操作数时直接输出;                                               当遇到操作符...
  • qq_16255321
  • qq_16255321
  • 2014-07-01 22:42:26
  • 1390

前缀中缀后缀表达式及其互相转换

计算机中前缀中缀后缀表达式是数据结构栈的重要应用,他们都是对表达式的记法,只是相对位置不一样,顾名思义,前缀表达式指的是符号都在操作数之前,中缀表达式指的是运算符都在操作数之后,而后缀表达式是之后。如...
  • yanerhao
  • yanerhao
  • 2015-05-24 19:59:02
  • 7463

利用栈的数据结构实现中缀表达式到后缀表达式的转换

本文中将介绍如何使用栈来实现简单的中缀表达式转换为后缀表达式。后缀表达式中不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。 中缀...
  • liuxiao2030
  • liuxiao2030
  • 2017-01-19 17:14:19
  • 713

c++ 数据结构 利用顺序栈实现多项式的中缀转后缀

利用顺序栈这种数据结构实现表达式的中缀转后缀,与上一篇博客结合起来就可以形成一个简单的可进行+ -* /等简单操作的计算器~\(≧▽≦)/~啦啦啦...
  • sinat_34927324
  • sinat_34927324
  • 2016-11-21 20:48:16
  • 905

前缀转中缀(利用栈)

#include #include #include #include #include #include #include #include #include #include ...
  • zjck1995
  • zjck1995
  • 2015-12-15 10:18:28
  • 369

python数据结构与算法 10 栈的应用之中缀转后缀表达式算法的实现

General Infix-to-Postfix Conversion 中缀转后缀的算法 We need todevelop an algorithm to convert any infix exp...
  • ppabcde
  • ppabcde
  • 2014-03-16 15:24:58
  • 1960

栈练习之C语言中实现中缀转后缀表达式

#include #include #include #include #include "Myatoi.c" extern int myatoi(const char *str); #def...
  • lwb102063
  • lwb102063
  • 2016-06-29 20:37:05
  • 2514

栈的重要应用之中缀转后缀表达式算法

今天又看了中缀转后缀表达式的算法,才知道这个有名字交调度场算法(Shunting-yard algorithm,因过程类似火车编组场而得名),居然是Dijstra发明的,原来的贡献遍布CS各个角落。。...
  • richardzrc
  • richardzrc
  • 2014-05-18 21:14:54
  • 1281

7-4 表达式转换(25 point(s))(栈的应用)

7-4 表达式转换(25 point(s)) 算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀...
  • codeswarrior
  • codeswarrior
  • 2017-11-10 21:40:43
  • 305
收藏助手
不良信息举报
您举报文章:中缀到后缀的转换--栈实现
举报原因:
原因补充:

(最多只允许输入30个字)