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;
}

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

(0)

相关推荐

  • C++中缀表达式转后缀表达式的方法

    本文实例为大家分享了C++中缀表达式转后缀表达式的具体代码,供大家参考,具体内容如下 1.初始化两个栈:运算符栈s1和储存中间结果的栈s2: 2.从左至右扫描中缀表达式: 3.遇到操作数时,将其压s2: 4.遇到运算符时,比较其与s1栈顶运算符的优先级: 1).如果s1为空,或栈顶运算符为左括号"(",则直接将此运算符入栈: 2).否则,若优先级比栈顶运算符的高,也将运算符压入s1 3).否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较: 5.

  • C++实现中缀表达式转后缀表达式

    本文实例为大家分享了C++实现中缀表达式转后缀表达式的具体代码,供大家参考,具体内容如下 一.思路:和中缀表达式的计算类似,只不过不用计算,把表达式输出即可 1.用字符数组存储整行输入的中缀表达式: 2.接着从字符数组的0位置开始判断字符,如果是数字,那就要判断后面是否是数字,如果是就不断扫描组成一个整数 (暂不考虑负数和小数),最终组成一个整数,然后输出这个数(因为不用计算,所以直接输出即可): 3.如果是左括号,直接进符号栈: 4.如果是操作运算符,与符号栈的栈顶元素比较优先级:如果高就压入

  • C语言实现中缀表达式转换为后缀表达式

    本文实例为大家分享了C语言实现中缀表达式转后缀表达式的具体代码,供大家参考,具体内容如下 中缀表达式转换为后缀表达式(思路) 1.创建栈 2.从左向右顺序获取中缀表达式 a.数字直接输出 b.运算符 情况一:遇到左括号直接入栈,遇到右括号将栈中左括号之后入栈的运算符全部弹栈输出,同时左括号出栈但是不输出. 情况二:遇到乘号和除号直接入栈,直到遇到优先级比它更低的运算符,依次弹栈. 情况三:遇到加号和减号,如果此时栈空,则直接入栈,否则,将栈中优先级高的运算符依次弹栈(注意:加号和减号属于同一个优

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

    本文实例为大家分享了C++实现中缀表达式转后缀表达式的具体代码,供大家参考,具体内容如下 题目:现有中缀表达式如:1+(2-3)*4+10/5 请用栈的特性编写一个程序,使得程序输出后缀表达式 分析如下: STEP1: 1+(2-3)*4+10/5 首先遇到第一个输入是数字1,数字在后缀表达式中都是直接输出,接着是符号"+",入栈: STEP2: 1+(2-3)*4+10/5 第三个字符是"(",依然是符号,入栈,接着是数字2,输出,然后是符号"-&quo

  • Java中缀表达式转后缀表达式实现方法详解

    本文实例讲述了Java中缀表达式转后缀表达式实现方法.分享给大家供大家参考,具体如下: 本文先给出思路与方法,最后将给出完整代码 项目实战: https://www.jb51.net/article/158335.htm 算法综述: 一.中缀表达式转后缀表达式: 1.中缀表达式要转后缀表达式,首先需要两个Stack(栈),其中一个应用于存放字符,另一个用于存放数字. 2.读到数字直接存入数字栈中,读到字符时,要咸鱼栈内前一元素(字符)进行比较,当当前(要存入的字符)优先级大于迁移字符时才存入,否

  • Java中缀表达式转后缀表达式流程详解

    目录 一.栈 1.栈的基本介绍 2.栈的底层实现 二.中缀表达式转后缀表达式 1.拆解中缀表达式 2.中缀转后缀的算法 3.中缀转后缀代码解析 4.对后缀表达式进行计算 一.栈 1.栈的基本介绍 栈是⼀个先⼊后出的有序列表.栈(stack)是限制线性表中元素的插⼊和删除只能在线性表的同⼀端进⾏的⼀种特殊线性表.允许插⼊和删除的⼀端,为变化的⼀端,称为栈顶(Top),另⼀端为固定的⼀端,称为栈底(Bottom). 根据栈的定义可知,最先放⼊栈中元素在栈底,最后放⼊的元素在栈顶,⽽删除元素刚好相反,

  • java数据结构与算法之中缀表达式转为后缀表达式的方法

    本文实例讲述了java数据结构与算法之中缀表达式转为后缀表达式的方法.分享给大家供大家参考,具体如下: //stack public class StackX { private int top; private char[] stackArray; private int maxSize; //constructor public StackX(int maxSize){ this.maxSize = maxSize; this.top = -1; stackArray = new char[

  • 详解C++编程中的主表达式与后缀表达式编写基础

    主表达式 主表达式是更复杂的表达式的构造块.它们是文本.名称以及范围解析运算符 (::) 限定的名称.主表达式可以具有以下任一形式: literal this :: name name ( expression ) literal 是常量主表达式.其类型取决于其规范的形式. this 关键字是指向类对象的指针.它在非静态成员函数中可用,并指向为其调用函数的类的实例. this 关键字只能在类成员函数体的外部使用. this 指针的类型是未特别修改 this 指针的函数中的 type *const

  • C语言利用栈实现对后缀表达式的求解

    本文实例为大家分享了C语言实现对后缀表达式(逆波兰表达式)的求解代码,供大家参考,具体内容如下 逆波兰表达式: 逆波兰表达式又叫后缀表达式.它是由相应的语法树的后序遍历的结果得到的. 例:5 - 8*(6 + 7) + 9 / 4: 其中缀表达式为:5 - 8 * 6 + 7 + 9 / 4 其语法树如下: 因此根据语法树可以得出他后序遍历(后缀表达式)为: 5 8 6 7 + * - 9 4 / + 这样就实现了中缀表达式到后缀表达式的转换. 同样的也可以得出他的前序遍历(前缀表达式也称波兰表

  • Golang栈结构和后缀表达式实现计算器示例

    目录 引言 问题 中缀.后缀表达式的计算 人利用中缀表达式计算值 计算机利用后缀表达式计算值 计算后缀表达式的代码实现 中缀表达式转后缀表达式 转换过程 转换的代码实现 总结 引言 只进行基本的四则运算,利用栈结构和后缀表达式来计算数学表达式的值. 本文代码:GitHub 运行效果: 问题 如果只能进行两个值的加减乘除,如何编程计算一个数学表达式的值? 比如计算 1+2*3+(4*5+6)*7,我们知道优先级顺序 () 大于 * / 大于 + - ,直接计算得 1+6+26*7 = 189 中缀

随机推荐