后缀表达式+栈(详解)(c++)

前言

很抱歉,上一期没有介绍栈stack的用法,今天简要介绍一下,再讲讲后缀表达式,用stack栈做一些后缀表达式的练习。

栈stack是c++中系统给出的栈,有了它,就不用自己创建栈啦!

头文件

栈stack的头文件就是**#include <stack>**

创建

定义一个名叫a的字符串栈:stack<char> a;

定义一个名叫a的整数栈:stack<int> a;

以此类推

用法

在栈a的栈顶加入元素b:a.push(b)

删除栈a的栈顶元素:a.pop()

栈a的栈顶元素:a.top()

判断栈a是否为空:a.empty()

后缀表达式

我们做数学时,用的都是中缀表达式

那么,什么是中缀表达式呢?

如:2+3,(5+6+7)/2......这些都是中缀表达式。

后缀表达式,就是在中缀表达式的基础上,将数字提前,把符号往后放。

如:

2+3的后缀表达式是2 3 +

(5+6+7)/2的后缀表达式是5 6 7 + + 2 /

而中缀表达式转成后缀表达式的规则是:

1.操作数直接输出

2.操作符入栈前,弹出栈中优先级更高或相等的运算符

3.左括号(入栈,右括号)弹出栈内元素直到(

4.操作符优先级 *和/大于+和-

那么,你学会了吗?

中缀转后缀

中缀表达式转后缀表达式的方法已经说过了,直接上代码:

cpp 复制代码
#include <iostream>
#include <stack>

using namespace std;

int main()
{
	stack<char> a;
	int n = 0;
	string str;
	while(true)
	{
		cin>>str[n];
		if(str[n]=='.') break;
		n++;
	}
	string b;
	string tmp;
	int lb = 0;
	int lt = n;
	for(int i = 0;i<n;i++)
	{
		if(str[i]=='*'||str[i]=='/')
		{
			while(true)
			{
				if(a.empty()==true) break;
				if(a.top()=='+'||a.top()=='-'||a.top()=='(') break;
				b[lb++] = a.top();
				a.pop();
				lt--;
			}
			a.push(str[i]);
			tmp[lt++] = str[i];
		}
		else if(str[i]=='+'||str[i]=='-')
		{
			while(true)
			{
				if(a.empty()==true) break;
				if(a.top()=='(') break;
				b[lb++] = a.top();
				a.pop();
				lt--;
				a.push(str[i]);
				tmp[lt++] = str[i];
			}
			a.push(str[i]);
		}
		else if(str[i]=='('||str[i]==')')
		{
			
			if(str[i]=='(')
			{
				a.push(str[i]);
				tmp[lt++] = str[i];
			}
			else if(str[i]==')')
			{
				while(true)
				{
					if(a.empty()==true) break;
					if(a.top()=='(') break;
					b[lb++] = a.top();
					a.pop();
					lt--;
				}
				
				a.pop();
				lt--;
			}
		}
		else
		{
			b[lb++] = str[i];
		}
	}
	
	while(a.empty()!=true)
	{
		b[lb++] = a.top();
		a.pop();
	}
	for(int i = 0;i<lb;i++)
	{
		cout<<b[i]<<" ";
	}
	
	return 0;
}

后缀表达式求值

(输入以点为结束)

cpp 复制代码
#include <iostream>
#include <stack>

using namespace std;

int main()
{
	
	stack<int> a;
	while(true)
	{
		char ch;
		cin>>ch;
		if(ch=='.') break;
		if(ch>='0'&&ch<='9')
		{
			a.push((int)ch-48);
		}
		else if(ch!=' ')
		{
			int aa = a.top();
			a.pop();
			int bb = a.top();
			a.pop();
			if(ch=='*') a.push(aa*bb);
			else if(ch=='/') a.push(bb/aa);
			else if(ch=='+') a.push(aa+bb);
			else if(ch=='-') a.push(bb-aa);
		}
	}
	cout<<a.top();
	
	return 0;
}
相关推荐
scx201310045 小时前
20260105 莫队总结
c++
情缘晓梦.5 小时前
C语言数据存储
c语言·开发语言
Q741_1475 小时前
海致星图招聘 数据库内核研发实习生 一轮笔试 总结复盘(1) 作答语言:C/C++ 链表 二叉树
开发语言·c++·经验分享·面试·笔试
咔咔咔的5 小时前
1970. 你能穿过矩阵的最后一天
c++
_OP_CHEN5 小时前
【从零开始的Qt开发指南】(十九)Qt 文件操作:从 I/O 设备到文件信息,一站式掌握跨平台文件处理
开发语言·c++·qt·前端开发·文件操作·gui开发·qt文件
CSDN_RTKLIB5 小时前
【std::map】双向迭代器说明
c++·stl
王老师青少年编程5 小时前
信奥赛C++提高组csp-s之欧拉回路
c++·算法·csp·欧拉回路·信奥赛·csp-s·提高组
No0d1es5 小时前
2025年12月 GESP CCF编程能力等级认证C++六级真题
c++·青少年编程·gesp·ccf·6级
Terrence Shen5 小时前
【CUDA编程系列】之01
c++·人工智能·深度学习·机器学习
墨有6665 小时前
数学分析栈的出栈顺序:从算法判断到数学本质(卡特兰数初探)
c++·算法·数学建模