数据结构--【栈与队列】笔记

栈的应用【实验题】

使用栈实现后缀表达式计算,其中,在后缀表达式中,输入的数字为整数,且为正数,数字、符号之间用空格隔开,整个后缀表达式用"#"表示结束。其中,整个后缀表达式长度不超过200,每个数字位数不超过10。

提示:读取数据的过程中,可以利用栈处理每个数字。

输入样例:

11 2 3 + * #(注:对应的中缀表达式是11*(2+3))

6 2 3 + * 5 / 7 - #(注:对应的中缀表达式是6*(2+3)/5-7)

输出样例:

55

-1

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;
struct stack
{
	int a[300];
	int index = -1;
	void instack(int x)  //入栈操作
	{
		a[++index] = x;
	}
	void calculate(char k)  //k是运算符
	{
		int sum = 0;
		int k1, k2;
		k1 = showtop(); outstack();
		k2 = showtop(); outstack();
		if (k == '+')
		{
			sum = k1 + k2;
		}
		else if (k == '-')
		{
			sum = k2 - k1;
		}
		else if (k == '*')
		{
			sum = k1 * k2;
		}
		else if (k == '/')
		{
			sum = k2 / k1;
		}
		instack(sum);
	}
	void outstack() //出栈
	{
		index--;
	}
	int showtop()  //显示栈顶字符
	{
		return a[index];
	}
};
int main()
{
	stack f;
	string b;
	while (cin >> b && b != "#")
	{
		if (b == "+" || b == "-" || b == "*" || b == "/")
		{
			f.calculate(b[0]);
		}
		else
		{
			int num = stoi(b);
			f.instack(num);
		}
	}
	cout << f.showtop() << endl;
	return 0;
}

整体还是很简单的,主要操作步骤如下

1.写一个栈的结构,这里面设置栈结构(a\[\]数组),index索引指向目前栈顶,并包含入栈、出栈、显示栈顶字符操作

2.输入字符

3.写运算calculate函数

要注意的问题是cin可以隔断输入的string b,此时比如单个输入的"11"就是要给字符串b

cpp 复制代码
string b;
	while (cin >> b && b != "#")
	{
		if (b == "+" || b == "-" || b == "*" || b == "/")
		{
			f.calculate(b[0]);
		}
		else
		{
			int num = stoi(b);
			f.instack(num);
		}
	}

同时calculate()也可以用switch写,更简洁一些

cpp 复制代码
 void calculate(char k) {
        int right = a[index--]; // 右操作数(栈顶)
        int left = a[index--];  // 左操作数(次栈顶)
        int sum = 0;
        switch(k) {
            case '+': sum = left + right; break;
            case '-': sum = left - right; break;
            case '*': sum = left * right; break;
            case '/': sum = left / right; break; // 修正为 left / right
        }
        a[++index] = sum; // 结果入栈
    }
相关推荐
CSharp精选营2 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
RainCity2 天前
Java Swing 自定义组件库分享(十二)
java·笔记·后端
刘马想放假5 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠6 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
LinXunFeng10 天前
Obsidian - 使用 Share Note 分享笔记并自部署
前端·笔记·github
Darling噜啦啦13 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠14 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾14 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
闪闪发亮的小星星14 天前
高斯光以及高斯光公式解释
笔记
cqbzcsq14 天前
CellFlow虚拟细胞论文阅读
论文阅读·人工智能·笔记·学习·生物信息