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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构学习笔记1 C++栈实现中缀转后缀 -> 正文阅读

[数据结构与算法]数据结构学习笔记1 C++栈实现中缀转后缀

C++栈实现中缀转后缀

算法思想

手算

① 先确定运算符的顺序
② 按[左操作数,右操作数,运算符]方式组合成一个新操作数。
③ 重复执行②直到所有的运算符都被处理
“左优先”原则:只要左边的运算符能先计算,就先算左边的。

用栈具体实现

① 初始化一个栈,用于保存暂时还不能确定的运算符。
② 从左到右处理各个元素,直到末尾,可能有三种情况
(1)遇到操作数。直接加入后缀表达式。
(2)遇到界限符。遇到左括号直接入栈;遇到右括号依次弹出栈内运算符并加入后缀表达式,直到弹出左括号为止。注意:左括号不加入后缀表达式。
(3)遇到运算符。依次弹出栈中优先级高于或等于当前运算符的所有运算符并加入后缀表达式,若遇到左括号或者栈空就停止。之后再把当前运算符入栈。
③ 按上述方法处理完所有字符后,将栈中剩余运算符依次弹出,加入后缀表达式。

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<stack>
#include<iostream>
using namespace std;
#define MaxSize 1000

//中缀表达式转后缀表达式

//优先级比较
//s1的优先级低于s2返回true
bool Pricom(char s1, char s2) {
	if ((s1 == '+' || s1 == '-') && (s2 == '*' || s2 == '/'))
	{
		return true;
	}
	return false;

}



void Suffix(char* str, char* suf) {//中缀表达式输入和后缀表达式结果
	stack<char>s;//定义栈
	s.push(10000);//压一个大数防止s为空栈时不能调用pop()
	int m = 0;//suf的下标
	for (int i = 0; i < strlen(str); i++){//从左到右扫描所有元素,直到末尾
		if (str[i] >= '0' && str[i] <= '999'){
			suf[m++] = str[i];//遇到操作数直接加入后缀表达式。
		}
		else if (str[i] == '(') {
			s.push(str[i]);//遇到左括号直接入栈
		}
		else if (str[i] == ')'){//遇到右括号依次弹出栈内运算符并加入后缀表达式
			while (s.top()!='('){//直到弹出左括号为止,但左括号不加入后缀表达式
				suf[m++] = s.top();
				s.pop();
			}
			s.pop();
		}
		else if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/') {//遇到运算符
			while (Pricom(str[i], s.top()) && s.top()!='(' && !s.empty())//栈中优先级高于或等于当前运算符的所有运算符
			{
				suf[m++] = s.top();//依次弹出并加入后缀表达式
				s.pop();
			}//若遇到左括号或者栈空就停止
			s.push(str[i]);//再把当前运算符入栈
		}
	}
	while (!s.empty()&&s.top() != 10000)//压栈底的大数不出栈
	{
		suf[m++] = s.top();//剩余运算符依次出栈,加入后缀表达式
		s.pop();
	}
	suf[m - 1] = '\0'; // 确保suf不会有多余内容
}

int main(void) {
	char a[MaxSize] = " ";
	cin >> a;
	char b[MaxSize] = " ";
	Suffix(a, b);
	cout << b;

	return 0;
}

运行示例一:
运行示例一
运行示例二:
运行示例二

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-14 16:12:59  更:2021-12-14 16:13:43 
 
开发: 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 16:40:37-

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