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

栈的应用【实验题】

使用栈实现后缀表达式计算,其中,在后缀表达式中,输入的数字为整数,且为正数,数字、符号之间用空格隔开,整个后缀表达式用"#"表示结束。其中,整个后缀表达式长度不超过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; // 结果入栈
    }
相关推荐
ChinaRainbowSea1 小时前
MySQL 索引的数据结构(详细说明)
java·数据结构·数据库·后端·mysql
星图辛某人1 小时前
《Linux命令行和shell脚本编程大全》第四章阅读笔记
linux·运维·笔记
去看全世界的云1 小时前
【Kotlin】Kotlin基础笔记
android·java·笔记·kotlin
@卡卡-罗特2 小时前
Spring Boot笔记(上)
spring boot·笔记·后端
白晨并不是很能熬夜2 小时前
【JVM】字节码指令集
java·开发语言·汇编·jvm·数据结构·后端·javac
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧2 小时前
C语言_数据结构总结7:顺序队列(循环队列)
c语言·开发语言·数据结构·算法·visualstudio·visual studio
橘颂TA2 小时前
每日一练之合并两个有序链表
数据结构·链表
LIUJH12332 小时前
数据结构——单调栈
开发语言·数据结构·c++·算法
shylyly_3 小时前
list的模拟实现
数据结构·c++·链表·迭代器·list·list的模拟实现
孤寂大仙v3 小时前
【Linux笔记】理解文件系统(上)
linux·运维·笔记