IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构-3.3 堆栈应用:表达式求值-程序示例 -> 正文阅读

[数据结构与算法]数据结构-3.3 堆栈应用:表达式求值-程序示例

3.3 堆栈应用:表达式求值

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

基本原则:从头到尾读取中缀表达式的每个对象,对不同对象按不同的情况处理

  1. 运算数:直接输出
  2. 左括号:压入堆栈
  3. 右括号:将栈顶的运算符弹出并输出,直到遇到左括号(出栈,不输出)
  4. 运算符
    • 优先级 > 栈顶运算符,则把它压栈
    • 优先级 <= 栈顶运算符,则将栈顶运算符弹出并输出;再比较新的栈顶运算符,直到该运算符的优先级 > 栈顶运算符的优先级为止,然后将该运算符压栈;
  5. 若各个对象处理完毕,则把堆栈中存留的运算符一并输出
$ Main.cpp文件:
#include <iostream>
#include "Stack.h"
using namespace std;

bool ComparePriority(char a, char b) {  //比较运算符优先级
    if ((a == '*' || a == '/') && (b == '+' || b == '-'))
        return true;
    else if (b == '(') return true;
    else return false;
}

int main() {
    Stack<char> s;
    string str;
    char c;
    cout << "请输入中缀表达式: " << endl;
    cin >> str;
    for (size_t i = 0; i < str.size(); i++)  //处理中缀表达式字符串的每一个字符
    {
        if ((str[i] >= '0' && str[i] <= '9') || str[i] == '.') //运算数直接输出
            cout << str[i];
        else if (str[i] == '(') //左括号'('压入堆栈
            s.Push(str[i]);
        else if (str[i] == ')') {  //将栈顶的运算符弹出并输出,直到遇到左括号
            while (true) {
                s.Pop(c);
                if (c != '(') cout << c;
                else break;
            }
        }
        else if (str[i] == '*' || str[i] == '/' || str[i] == '+' || str[i] == '-')
        {
        	//优先级<=栈顶运算符,将栈顶运算符弹出并输出;再比较新的栈顶运算符,直到优先级>它
            while (!s.StackEmpty() && !ComparePriority(str[i], s.GetTop()))
            {  
                s.Pop(c);
                cout << c;
            }
            s.Push(str[i]);  //优先级大于栈顶运算符优先级,入栈
        }
    }
    while (!s.StackEmpty()) { //各个字符处理完毕后,把堆栈中存留的运算符一并输出
        s.Pop(c);
        cout << c;
    }
    return 0;
}

测试输入12*(9+6/3-5)+4
运行结果12963/+5-*4+
测试输入21+2-3+4
运行结果212+3-4+
测试输入3(1+2)*3/4-5
运行结果312+3*4/5-
$ Stack.h文件
#include <iostream>
#include <malloc.h>

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

template<class T>
class Stack
{
private:
	T* top;  // 栈顶指针 
	T* base; // 栈底指针
	int stacksize; // 栈容量
	int length;  // 栈中元素个数
public:
	Stack();
	~Stack();
	bool StackEmpty();  // 判断是否栈空
	int StackLength();  // 取栈长度
	T GetTop();  // 取栈顶元素
	bool Push(T e);  // 入栈
	bool Pop(T &e);  // 出栈(保留出栈元素)
};

template<class T>
inline Stack<T>::Stack()
{
	base = (T*)malloc(STACK_INIT_SIZE * sizeof(T));
	if (!base) exit(-1);
	top = base;
	stacksize = STACK_INIT_SIZE;
	length = 0;
}

template<class T>
inline Stack<T>::~Stack()
{
	free(base);
	base = NULL;
	top = NULL;
}

template<class T>
inline bool Stack<T>::StackEmpty()
{
	return (top == base);
	// 栈空返回true,栈非空返回false
}

template<class T>
inline int Stack<T>::StackLength()
{
	return length;
}

template<class T>
inline T Stack<T>::GetTop()
{
	if (StackEmpty()) exit(-1);
	return *(top - 1);
}

template<class T>
inline bool Stack<T>::Push(T e)
{
	if (top - base >= stacksize)
	{
		T* tmp;
		tmp = (T*)realloc( base, (stacksize + STACKINCREMENT) * sizeof(T) );
		if (tmp != NULL) base = tmp;  // 成功重新分配后替换原指针
		top = base + stacksize;
		stacksize += STACKINCREMENT;
	}
	*top++ = e;
	length++;
	return true;
}

template<class T>
inline bool Stack<T>::Pop(T& e)
{
	if (StackEmpty()) return false;
	e = *(top - 1);
	top--;
	length--;
	return true;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-22 14:55:44  更:2021-09-22 14:57:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:43:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码