C++利用栈实现中缀表达式转后缀表达式

 更新时间:2020年04月26日 14:41:09   作者:Halosec_Wei  
这篇文章主要为大家详细介绍了C++利用栈实现中缀表达式转后缀表达式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C++实现中缀表达式转后缀表达式的具体代码,供大家参考,具体内容如下

题目:现有中缀表达式如:1+(2-3)*4+10/5

请用栈的特性编写一个程序,使得程序输出后缀表达式

分析如下:

STEP1:

1+(2-3)*4+10/5

首先遇到第一个输入是数字1,数字在后缀表达式中都是直接输出,接着是符号“+”,入栈:

STEP2:

1+(2-3)*4+10/5

第三个字符是“(”,依然是符号,入栈,接着是数字2,输出,然后是符号“-”,入栈:

STEP3:

1+(2-3)*4+10/5

接下来是数字3,输出,紧跟着是“)”,此时,我们需要去匹配栈里的“(”,然后再匹配前将栈顶数据依次出栈(这就好比括号里优先执行的道理):

STEP4:

1+(2-3)*4+10/5

紧接着是符号“*”,直接入栈

STEP5:

1+(2-3)*4+10/5

遇到数字4,输出,之后是符号“+”,此时栈顶元素是符号“*”,按照先乘除后加减原理,此时栈顶的乘号优先级比即将入栈的加好要大,所以出栈。
栈中第二个元素是加号,按理来说大家平起平坐,但是按照先来后到的原则,栈里的加号呆得太久了,也要出栈透透气。(同理如果栈里还有其他操作符,也是出栈)

最后把刚刚的那个加号入栈,操作如下图:

STEP6:

1+(2-3)*4+10/5

紧接着数字10,输出,最后是符号“/”,进栈:

STEP7:

1+(2-3)*4+10/5

最后一个数字5,输出,所有的输入处理完毕,但是栈中仍然有数据,所以将栈中符号依次出栈。

总结规则:

从左到右遍历中缀表达式的每个数字和符号,若是数字则直接输出,若是符号,则判断其与栈顶符号的优先级,是右括号或者优先级低于栈顶符号,则栈顶元素依次出栈并输出,直到遇到左括号或栈空才将低优先级的那个符号入栈

代码实现如下:

#include <stdio.h>
#include <stdlib.h>
 
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
 
typedef char ElemType;
typedef struct
{
 ElemType *base;
 ElemType *top;
 int stackSize;
}sqStack;
 
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;
}
 
Push(sqStack *s, ElemType e)
{
 // 栈满,追加空间,鱼油必须懂!
 if( s->top - s->base >= s->stackSize )
 {
  s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
  if( !s->base )
   exit(0);
 
  s->top = s->base + s->stackSize;
  s->stackSize = s->stackSize + STACKINCREMENT;
 }
 
 *(s->top) = e;  // 存放数据
 s->top++;
}
 
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;
 char c, e;
 
 InitStack( &s );
 
 printf("请输入中缀表达式,以#作为结束标志:");
 scanf("%c", &c);
 
 while( c != '#' )
 {
  while( c>='0' && c<='9' )
  {
   printf("%c", c);
   scanf("%c", &c);
   if( c<'0' || c>'9' )
   {
    printf(" ");
   }
  }
 
  if( ')' == c )
  {
   Pop(&s, &e);
   while( '(' != e )
   {
    printf("%c ", e);
    Pop(&s, &e);
   }
  }
  else if( '+'==c || '-'==c )
  {
   if( !StackLen(s) )
   {
    Push(&s, c);
   }
   else
   {
    do
    {
     Pop(&s, &e);
     if( '(' == e )
     {
      Push(&s, e);
     }
     else
     {
      printf("%c ", e);
     }
    }while( StackLen(s) && '('!=e );
    Push(&s, c);
   }
  }
  else if( '*'==c || '/'==c || '('==c )
  {
   Push(&s, c);
  }
  else if( '#'== c )
  {
   break;
  }
  else
  {
   printf("\n出错:输入格式错误!\n");
   return -1;
  }
 
  scanf("%c", &c);
 }
 
 while( StackLen(s) )
 {
  Pop(&s, &e);
  printf("%c ", e);
 }
 
 return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C++派生类与基类的转换规则

    C++派生类与基类的转换规则

    基类与派生类对象之间有赋值兼容关系,由于派生类中包含从基类继承的成员,具体表现在以下几个方面,需要的朋友可以参考下
    2012-11-11
  • C++成员函数后面加override问题

    C++成员函数后面加override问题

    这篇文章主要介绍了C++成员函数后面加override问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C++ typedef常见用法详解

    C++ typedef常见用法详解

    这篇文章主要介绍了C++ typedef用法详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • C语言动态与静态分别实现通讯录详细过程

    C语言动态与静态分别实现通讯录详细过程

    这篇文章主要为大家介绍了C语言动态与静态分别实现通讯录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C语言实现24点问题详解

    C语言实现24点问题详解

    24点问题就是在屏幕上输入1〜10范围内的4个整数(可以有重复),对它们进行加、减、乘、除四则运算后(可以任意的加括号限定计算的优先级),寻找计算结果等于24的表达式。本文将通过C语言实现24点问题的求解,需要的可以参考一下
    2021-12-12
  • QT应用启动失败排查方法小结

    QT应用启动失败排查方法小结

    启动QT应用经常会碰到应用启动失败,qt platform plugin无法启动,本文就来介绍一下QT应用启动失败排查方法小结,具有一定的参考价值,感兴趣的可以了解以下
    2023-09-09
  • 一篇文章带你了解C++Primer学习日记--处理数据

    一篇文章带你了解C++Primer学习日记--处理数据

    今天小编就为大家分享一篇关于C++对数器的使用讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-08-08
  • C++设计模式之代理模式

    C++设计模式之代理模式

    这篇文章主要介绍了C++设计模式之代理模式,本文讲解了什么是代理模式、代理模式的使用场合、代理模式的实现代码等内容,需要的朋友可以参考下
    2014-10-10
  • C++实现简单的学生成绩管理系统

    C++实现简单的学生成绩管理系统

    这篇文章主要为大家详细介绍了C++实现简单的学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C语言控制语句之 循环

    C语言控制语句之 循环

    C语言循环控制语句是一个基于C语言的编程语句,该语句主要有while循环语句、do-while循环语句和for循环语句来实现循环结构,今天通过本文给大家分享C控制语句的相关知识,需要的朋友参考下吧
    2021-07-07

最新评论