夸克网站免费进入,龙岩网站建设方案优化,羽毛球最新赛事,模块化局域网网站建设软件做题目的前提#xff1a;了解栈相关的知识
栈的相关知识#xff1a;
栈和队列栈#xff1a;只能在表尾进行插入或删除操作的线性表
栈顶#xff1a;表尾部#xff08;操作的一端#xff09;栈底#xff1a;表头部#xff08;固定的一端#xff09;空栈#xff1a;…做题目的前提了解栈相关的知识栈的相关知识栈和队列栈只能在表尾进行插入或删除操作的线性表栈顶表尾部操作的一端栈底表头部固定的一端空栈不含元素的空表栈的特性先进后出 / 后进先出栈的操作进栈插入元素、出栈删除最后插入的元素栈的顺序结构实现栈的顺序结构基于数组实现栈顶指针对应数组下标栈声明时已预先开辟数组空间无需动态初始化1. 基础定义宏、类型、结构体// 栈的最大容量 #define MAXSIZE 100 // 栈存储的数据类型 typedef int ElemType; // 顺序栈的结构体定义 typedef struct { ElemType data[MAXSIZE]; int top; // 栈顶指针取值范围-1 ~ MAXSIZE-1 } Stack;2. 栈的初始化函数// 初始化栈将栈顶指针设为-1表示空栈 void initStack(Stack *s) { s-top -1; }3. 判断栈是否为空// 判断栈是否为空空栈返回1非空返回0 int isEmpty(Stack *s) { if (s-top -1) { printf(空的\n); return 1; } else { return 0; } }4. 进栈压栈函数// 进栈将元素e压入栈成功返回1栈满返回0 int push(Stack *s, ElemType e) { // 判断栈是否已满 if (s-top MAXSIZE - 1) { printf(满了\n); return 0; } // 栈顶指针上移存入元素 s-top; s-data[s-top] e; return 1; }5. 出栈函数// 出栈取出栈顶元素存入*e成功返回1空栈返回0 int pop(Stack *s, ElemType *e) { // 判断栈是否为空 if (s-top -1) { printf(空的\n); return 0; } // 取出栈顶元素栈顶指针下移 *e s-data[s-top]; s-top--; return 1; }6. 获取栈顶元素函数// 获取栈顶元素将栈顶元素存入*e成功返回1空栈返回0 int getTop(Stack *s, ElemType *e) { // 判断栈是否为空 if (s-top -1) { printf(空的\n); return 0; } // 取出栈顶元素不移动栈顶指针 *e s-data[s-top]; return 1; }力扣题链接20. 有效的括号 - 力扣LeetCode视频参考栈的拿手好戏| LeetCode20. 有效的括号_哔哩哔哩_bilibili题目类似题有效括号可参考这篇博客栈有效括号-CSDN博客力扣150. 逆波兰表达式求值 - 力扣LeetCode参考视频栈的最后表演 | LeetCode150. 逆波兰表达式求值_哔哩哔哩_bilibilipta题目解析题目看这个题目很懵不知道怎么就得出这个数了在这之前我们先了解一下逆波兰表达式也是后缀表达式123*就是逆波兰表达式3*21笔记A.了解什么事后缀表达式/逆波兰表达式1. 中缀表达式定义运算符位于两个操作数中间的表达式称为中缀表达式。示例12×3编译系统的处理局限直接从前往后读取中缀表达式时无法区分运算符的优先级因此实际中编译系统会将中缀表达式转换为后缀表达式逆波兰表达式。2. 后缀表达式/逆波兰表达式定义算术表达式中运算符位于对应操作数的后面。示例中缀表达式12×3对应的后缀表达式为1 2 3 × 计算示例以上述后缀为例这个计算也是二叉树的中序排序参考视频中的例子先算2×36再算167B.核心操作遇到数字入栈遇到操作符出栈计算完毕再入栈计算目标基于中缀表达式(12)×(34)其对应的后缀表达式为1 2 3 4 ×以下是该后缀表达式的计算过程。核心规则遇到数字 → 入栈遇到运算符 → 弹出栈顶 2 个元素运算结果入栈。计算步骤栈状态实时展示步骤操作处理后缀字符栈的状态栈顶在右侧运算过程1处理数字1[1]数字入栈2处理数字2[1, 2]数字入栈3处理运算符先弹出2、1运算123结果入栈[3]4处理数字3[3, 3]数字入栈5处理数字4[3, 3, 4]数字入栈6处理运算符先弹出4、3运算347结果入栈[3, 7]7处理运算符×先弹出7、3运算3×721结果入栈[21]8计算结束最终栈顶值21即表达式结果手写笔记C.总结栈的特性适合处理 “相邻字符的消去运算操作”是后缀表达式求值的核心数据结构。pta答案c语言版#include stdio.h #include ctype.h // 用于判断数字字符 // 1. 基础定义仅保留必需部分 #define MAXSIZE 20 // 适配题目表达式不超过20字符 typedef double ElemType; // 浮点型适配除法精度 typedef struct { ElemType data[MAXSIZE]; int top; // 栈顶指针-1表示空栈 } Stack; // 2. 栈的初始化函数必需 void initStack(Stack *s) { s-top -1; } // 4. 进栈压栈函数必需 int push(Stack *s, ElemType e) { if (s-top MAXSIZE - 1) { return 0; } s-top; s-data[s-top] e; return 1; } // 5. 出栈函数必需 int pop(Stack *s, ElemType *e) { if (s-top -1) { return 0; } *e s-data[s-top]; s-top--; return 1; } // 主函数后缀表达式求值 int main() { char expr[21]; // 存储后缀表达式最多20字符结束符 Stack s; // 定义栈变量 // 多组输入处理到文件尾 while (scanf(%s, expr) ! EOF) { initStack(s); // 初始化栈 // 遍历表达式字符 for (int i 0; expr[i] ! \0; i) { if (isdigit(expr[i])) { // 数字转浮点型压栈 ElemType num (double)(expr[i] - 0); push(s, num); } else { // 运算符弹出两个操作数计算 ElemType a, b, res; pop(s, b); // 右操作数 pop(s, a); // 左操作数 // 运算逻辑 switch (expr[i]) { case : res a b; break; case -: res a - b; break; case *: res a * b; break; case /: res a / b; break; default: res 0; } push(s, res); // 结果压栈 } } // 输出最终结果保留两位小数 ElemType result; pop(s, result); printf(%.2f\n, result); } return 0; }力扣答案c语言版#include stdio.h #include stdlib.h #include string.h #define MAXSIZE 10000 // 适配 tokens 最大长度 10^4 typedef struct { int data[MAXSIZE]; int top; // 栈顶指针-1 表示空栈 } Stack; // 初始化栈 void initStack(Stack *s) { s-top -1; } // 压栈 int push(Stack *s, int val) { if (s-top MAXSIZE - 1) return 0; s-data[s-top] val; return 1; } // 出栈结果存入 *val int pop(Stack *s, int *val) { if (s-top -1) return 0; *val s-data[s-top--]; return 1; } // 判断是否为运算符 int isOperator(char *token) { return strcmp(token, ) 0 || strcmp(token, -) 0 || strcmp(token, *) 0 || strcmp(token, /) 0; } int evalRPN(char** tokens, int tokensSize) { Stack s; initStack(s); // 初始化栈 for (int i 0; i tokensSize; i) { char *token tokens[i]; if (isOperator(token)) { // 弹出两个操作数计算 int b, a, res; pop(s, b); pop(s, a); // 按运算符计算除法向零截断 if (strcmp(token, ) 0) res a b; else if (strcmp(token, -) 0) res a - b; else if (strcmp(token, *) 0) res a * b; else res a / b; // 除法 push(s, res); } else { // 数字转整数压栈支持负数 int num atoi(token); push(s, num); } } // 栈顶即为结果 int result; pop(s, result); return result; }