数据结构之表达式求值(C++版)

#include <windows.h>
#include <iostream>
#include <stdlib.h>
#define MAXBUFFER 10
#define MAXLISTSIZE 100 //预设的存储空间最大容量
using namespace std;

typedef struct{
char *base; //存储空间基址
int *elem;
int top; //栈顶指针
int stacksize; //允许的最大存储空间以元素为单位
}Stack;

void InitStack(Stack &S)
{
// 构造一个最大存储容量为 maxsize 的空栈 S
int maxsize;
maxsize = MAXLISTSIZE;
S.base = new char[maxsize];
S.elem = new int[maxsize];
if (!S.base || !S.elem) exit(1); //存储分配失败
S.stacksize = maxsize;
S.top = 0; //空栈中元素个数为0
}

bool Push(Stack &S, char e)
{
// 若栈的存储空间不满,则插入元素 e 为新的栈顶元素,并返回 TRUE;否则返回 FALSE
if (S.top == S.stacksize) //栈已满,无法进行插入
return FALSE;
S.base[S.top] = e; //插入新的元素
++S.top; //栈顶指针后移
return TRUE;
}

bool Push(Stack &S, int e)
{
// 若栈的存储空间不满,则插入元素 e 为新的栈顶元素,并返回 TRUE;否则返回 FALSE
if (S.top == S.stacksize) //栈已满,无法进行插入
return FALSE;
S.base[S.top] = e; //插入新的元素
++S.top; //栈顶指针后移
return TRUE;
}

bool Pop(Stack &S, char &e)
{
//若栈不空,则删除S的栈顶元素,用 e 返回其值,并返回 TRUE;否则返回 FALSE
if (S.top == 0)
return FALSE;
e = S.base[S.top-1]; //返回非空栈中栈顶元素
--S.top;//栈顶指针前移
return TRUE;
}

bool Pop(Stack &S, int &e)
{
//若栈不空,则删除S的栈顶元素,用 e 返回其值,并返回 TRUE;否则返回 FALSE
if (S.top == 0)
return FALSE;
e = S.base[S.top-1]; //返回非空栈中栈顶元素
--S.top;//栈顶指针前移
return TRUE;
}

int StackLength(Stack S)
{
//返回S的元素个数,即栈的长度。
return S.top;
}
int main()
{
Stack S;
char c, e;
int d, f;
char a[100]; //存储后缀表达式
char str[10]; //临时缓冲区,存储浮点数和多位数
int i = 0, j = 0;
InitStack(S);
cout << "请输入中缀表达式,以#作为结束标志:";
cin >> c;
while(c != ‘#‘)
{
while((c >= ‘0‘ && c <= ‘9‘) || (c == ‘.‘))
{
a[i++] = c;
cin >> c;
if((c < ‘0‘ || c > ‘9‘) && c != ‘.‘)
{
a[i++] = ‘ ‘;
}
}
if(‘)‘ == c)
{
Pop(S, e);
while(‘(‘ != e)
{
a[i++] = e;
a[i++] = ‘ ‘;
Pop(S, e);
}
}
else if(‘+‘ == c || ‘-‘ == c)
{
if(!StackLength(S))
{
Push(S, c);
}
else
{
do
{
Pop(S, e);
if(‘(‘ == e)
{
Push(S, e);
}
else
{
a[i++] = e;
a[i++] = ‘ ‘;
}
}while(StackLength(S) && ‘(‘ != e);
Push(S, c);
}
}
else if(‘*‘ == c || ‘/‘ == c || ‘(‘ == c)
{
Push(S, c);
}
else if(‘#‘ == c)
{
break;
}
else
{
cout << "输入格式错误 << endl";
return -1;
}
cin >> c;
}
while(StackLength(S))
{
Pop(S, e);
a[i++] = e;
}
a[i++] = ‘ ‘;
a[i++] = ‘#‘;
j = i;
cout << "转换的后缀表达式为:";
for(i=0; i<j; i++)
cout << a[i];
cout << endl;
i = 0, j =0;
c = a[i++];
while(c != ‘#‘)
{
while((c >= ‘0‘ && c <= ‘9‘) || c == ‘.‘)
{
str[j++] = c;
str[j] = ‘\0‘;
if(j >= 10)
{
cout << "出错:输入的数据过大 << endl";
return -1;
}
c = a[i++];
if(c == ‘ ‘)
{
d = atof(str);
Push(S, d);
j = 0;
break;
}
}
switch(c)
{
case ‘+‘:
Pop(S, f);
Pop(S, d);
Push(S, d+f);
break;
case ‘-‘:
Pop(S, f);
Pop(S, d);
Push(S, d-f);
break;
case ‘*‘:
Pop(S, f);
Pop(S, d);
Push(S, d*f);
break;
case ‘/‘:
Pop(S, f);
Pop(S, d);
if(f != 0)
{
Push(S, d/f);
}
else
{
cout << "错误:除数为0";
return -1;
}
break;
}
c = a[i++];
}
Pop(S, d);
cout << "表达式的结果为:" << d << endl;
}

时间: 2024-10-07 17:28:20

数据结构之表达式求值(C++版)的相关文章

C++与数据结构 -- stack实现表达式求值[注释版]

有好多朋友评论以前的那篇博文说:代码中间没有注释.由于课程一直比较紧张,所以答应的注释直到今天才写, 发表出来,与大家共享! #include <map> #include <stack> #include <string> #include <iostream> #include <fstream> using namespace std; //为+,-,*,/运算符 设定优先级 map<char,int> priority; vo

数据结构例程——表达式求值(用栈结构)

本文针对数据结构基础系列网络课程(3):栈和队列中第5课时栈的应用1-表达式求值. 例:用户输入一个包含"+"."-"."*"."/".正整数和圆括号的合法数学表达式,计算该表达式的运算结果. 解答: #include <stdio.h> #include <stdlib.h> #define MaxOp 100 #define MaxSize 100 struct //设定运算符优先级 { char

数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em

数据结构 -- 整数算术表达式求值 (C/C++)

数据结构题集(C语言版)--严蔚敏,吴伟民编著 设置运算符栈和运算数栈辅助分析运算符有限关系. 读入表达式的字符序列的同时完成运算符和运算数(整数)的识别处理,以及相应的运算. 在识别出运算数的同时,要将其字符序列形式转换成整数形式. 1 /** 2 Function:整数算术表达式求值 3 Date:2014-11-10 4 Author:JackDawson 5 Compiler:gcc version 4.8.1 6 */ 7 #include <iostream> 8 #include

C++表达式求值(利用数据结构栈)

唉,刚刚用C++又又一次写了一个较完好的表达式求值程序,最后精简后程序还不到100行.这不经让我 想到了大一上学期刚学c语言时自己费了好大的劲,写了几百行并且功能还不是非常齐全(当时还不能计算有括号的表 达式)的简单计算器程序.刚把两个程序对照了一下.感触还是挺深的,同一时候也再一次体现了数据结构在程序设计 中的重要性. 曾经的那个程序有漏洞并且逻辑复杂,所以就不提了,仅仅说说如今改进后的程序,其思想主要是用到了 栈先进后出的数据结构.在该程序中建有两个栈:一个用于存储运算符,还有一个用于存储操

11、蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现

11.蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现 本篇名言:"人生不售来回票,一旦动身,绝不能复返." 继续栈应用实现,这次是来看下表达式求值的栈实现. 欢迎转载,转载请标明出处: 1.  表达式求值 表达式求值是设计语言编译中的一个基本问题,它的实现是栈应用的又一个典型例子. 任何一个表达式都是由操作数(Operand).运算符(operator)和界限符(delimiter)组成. 操作数可以是常数也可以是变量或变量的标识符. 运算符可以分为算术运算符.关系运算符和逻辑运算符

数据结构 表达式求值

实现表达式求值,以及表达式中括号是否匹配. 实现方法,建立两个栈,一个用来存放操作数,一个用来存放运算符.判断运算符优先级来确定什么时候出栈,利用一个数组去表示优先级 头文件代码如下: #ifndef STACK_H_INCLUDED #define STACK_H_INCLUDED #include <iostream> #include <string.h> using namespace std; template<class Type> class Stack

数据结构(7)----栈与队列之栈的应用四则运算表达式求值

栈与队列之栈的应用四则运算表达式求值 栈在四则运算表达式求值的应用为逆波兰表达式(后缀表达式) 普通算式(中缀表达式):9 + (3 - 1) * 3 + 10 / 2     ---(1) 逆波兰表达式(后缀表达式):9 3 1 - 3 * + 10 2 /         ---(2) 1:逆波兰表达式的计算规则 从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到符号,就将处于栈顶的两个数字出栈,进行运算,再把运算结果进栈,一直到最终获得结果.接下来我们以(2)式为例:

数据结构 栈的应用 --表达式求值

一: 中缀表达式求值  思想: 需要2个栈,运算对象栈OPND,运算符栈OPTR, 1:将栈OPND初始化为空,栈OPTR初始化为表达式的定界符# 2:扫描表达式,直到遇到结束符# 2.1:当前字符是运算对象,入栈OPND 2.2:当前字符是运算符且优先级比栈OPTR的栈顶运算符优先级高,入栈OPTR,处理下一个字符 2.3:当前字符是运算符且优先级比栈OPTR的栈顶运算符优先级低,则从栈OPND出栈2个运算对象,从栈OPTR出栈一个运算符进行运算,并将运算结果入栈OPND,处理当前字符 2.4