数据结构 栈和队列的应用

在昨天分享了有关栈和队列的基础知识和基本操作后,今天来分享一些有关栈和队列的应用

栈和队列的应用

  1. 删除字符串中的所有相邻重复项
#include <iostream>
#include <stack>
using namespace std;
string remove(string S)
{stack<char> charStack;for (int i = 0; i < S.length(); ++i){char c=S[i];if (!charStack.empty() && charStack.top() == c){charStack.pop();}else{charStack.push(c);}}string result;while (!charStack.empty()){result = charStack.top() + result;charStack.pop();}return result;
}
int main()
{string in;cin >> in;string result = remove(in);cout<<result;return 0;
}
  1. 括号匹配问题(类比20.LeetCode 有效的括号)
#include <iostream>
#include <stack>
#include <string>using namespace std;bool match(string input)
{stack<char> s;for (int i = 0; i < input.length(); i++){char bracket = input[i];if (bracket == '(' || bracket == '{' || bracket == '['){s.push(bracket);}else if (bracket == ')' || bracket == '}' || bracket == ']'){if (s.empty()){return false;}char top = s.top();s.pop();if ((bracket == ')' && top != '(') || (bracket == '}' && top != '{') || (bracket == ']' && top != '[')){return false;}}}return s.empty();
}int main()
{string input;cin >> input;if (match(input)){cout << "yes" << endl;}else{cout << "no" << endl;}return 0;
}
  1. 计算后缀表达式
#include <iostream>
#include <stack>
#include <string>
#include <cctype>
#include <cstdlib>using namespace std;int customAtoi(const string &str)
{int result = 0;int sign = 1;size_t i = 0;if (str[0] == '-'){sign = -1;i = 1;}for (; i < str.length(); i++){if (isdigit(str[i])){result = result * 10 + (str[i] - '0');}else{cerr << "Error: Invalid character in input: " << str[i] << endl;std::exit(1);}}return result * sign;
}bool isOperator(const string &token)
{return (token == "+" || token == "-" || token == "*");
}int evaluatePostfixExpression()
{stack<int> operands;string token;while (cin >> token){if (token == "#"){break;}if (!isOperator(token)){operands.push(customAtoi(token));}else{int operand2 = operands.top();operands.pop();int operand1 = operands.top();operands.pop();int result;if (token == "+"){result = operand1 + operand2;}else if (token == "-"){result = operand1 - operand2;}else if (token == "*"){result = operand1 * operand2;}operands.push(result);}}if (!operands.empty()){return operands.top();}cerr << "Error: Invalid expression." << endl;std::exit(1);
}int main()
{int result = evaluatePostfixExpression();cout << result << endl;return 0;
}
  1. 表达式求值
#include <iostream>
#include <stack>
#include <string>
#include <cctype>using namespace std;int precedence(char op)
{if (op == '+' || op == '-'){return 1;}else if (op == '*' || op == '/'){return 2;}return 0;
}int evaluateExpression(const string &expression)
{stack<int> values;stack<char> operators;for (size_t i = 0; i < expression.length(); i++){if (isspace(expression[i])){continue;}else if (isdigit(expression[i])){int num = 0;while (i < expression.length() && isdigit(expression[i])){num = num * 10 + (expression[i] - '0');i++;}i--;values.push(num);}else if (expression[i] == '('){operators.push(expression[i]);}else if (expression[i] == ')'){while (!operators.empty() && operators.top() != '('){char op = operators.top();operators.pop();int operand2 = values.top();values.pop();int operand1 = values.top();values.pop();if (op == '+'){values.push(operand1 + operand2);}else if (op == '-'){values.push(operand1 - operand2);}else if (op == '*'){values.push(operand1 * operand2);}else if (op == '/'){values.push(operand1 / operand2);}}operators.pop(); }else if (expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/'){while (!operators.empty() && operators.top() != '(' && precedence(operators.top()) >= precedence(expression[i])){char op = operators.top();operators.pop();int operand2 = values.top();values.pop();int operand1 = values.top();values.pop();if (op == '+'){values.push(operand1 + operand2);}else if (op == '-'){values.push(operand1 - operand2);}else if (op == '*'){values.push(operand1 * operand2);}else if (op == '/'){values.push(operand1 / operand2);}}operators.push(expression[i]);}}while (!operators.empty()){char op = operators.top();operators.pop();int operand2 = values.top();values.pop();int operand1 = values.top();values.pop();if (op == '+'){values.push(operand1 + operand2);}else if (op == '-'){values.push(operand1 - operand2);}else if (op == '*'){values.push(operand1 * operand2);}else if (op == '/'){values.push(operand1 / operand2);}}return values.top();
}int main()
{string expression;getline(cin, expression);int result = evaluateExpression(expression);cout << result << endl;return 0;
}
  1. 回文链表
#include <bits/stdc++.h>
using namespace std;
struct Node
{int data;Node *next;
};
void createList(Node *&h,int n)
{Node *p,*r;h=new Node;h->next=NULL;r=h;for(int i=1; i<=n; i++){p=new Node;cin>>p->data;r->next=p;r=p;}r->next=NULL;
}
void printList(Node *h)
{Node *p;p=h->next;while(p){cout<<p->data<<" ";p=p->next;}cout<<endl;
}bool isPalindrome(Node *head)
{if (!head || !head->next){return true;}Node *slow = head;Node *fast = head;while (fast && fast->next){slow = slow->next;fast = fast->next->next;}Node *prev = NULL;Node *curr = slow;while (curr){Node *next = curr->next;curr->next = prev;prev = curr;curr = next;}Node *left = head->next;Node *right = prev;while (left && right){if (left->data != right->data){return false;}left = left->next;right = right->next;}return true;
}int main()
{int n;Node *h;cin>>n;createList(h,n);cout<<(isPalindrome(h)?"yes":"no");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/164710.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySql表中添加emoji表情

共五处需要修改。 语句执行修改&#xff1a; ALTER TABLE xxxxx CONVERT TO CHARACTER SET utf8mb4;

微型计算机原理MOOC题

一、8254 1.掉坑了&#xff0c;AL传到端口不意味着一定传到的是低位&#xff0c;要看控制字D5和D4&#xff0c;10是只写高位&#xff0c;所以是0A00.。。 2. 3. 4.待解决&#xff1a;

优化C++资源利用:探索高效内存管理技巧

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; &#x1f354;前言&#xff1a; 我们之前在C语言中学习过动态内存开辟&#xff0c;使用malloc、calloc与realloc进行开辟&#xff0c;使用free进行堆上内存的释放。进入C后对于动态内存开辟我们又有了新的内容new与dele…

CCC联盟——UWB MAC(一)

本文在前面已经介绍了相关UWB的PHY之后&#xff0c;重点介绍数字钥匙&#xff08;Digital Key&#xff09;中关于MAC层的相关实现规范。由于MAC层相应涉及内容比较多&#xff0c;本文首先从介绍UWB MAC的整体框架&#xff0c;后续陆续介绍相关的网络、协议等内容。 1、UWB MAC架…

真心的表扬与鼓励,胜过一万句说教

今天我想和大家分享一下&#xff0c;怎样跟孩子运用鼓励和表扬。我记得鲁道夫德雷克斯是阿德勒学派的心理学家&#xff0c;也是来自《孩子的挑战》一书的作者&#xff0c;他说孩子们需要鼓励&#xff0c;就像植物需要水&#xff0c;鼓励能让孩子知道自己做的事与自己是什么样的…

非自定义Bean注解开发Bean配置类的注解开发

目录 非自定义Bean注解开发 Bean配置类的注解开发 非自定义Bean注解开发 非自定义的Bean不能像自定义Bean使用Component进行管理&#xff0c;非自定义Bean要通过工厂的方式进行实例化&#xff0c;使用Bean标注方法即可&#xff0c;Bean的属性文beanName 如果Bean工厂方法需要参…

[23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution

paper | proj | code 提出一种基于K-Planes的4D point cloud Representation&#xff1b;提出一种Hybrid appearance model&#xff0c;包含image blending model和SH model。其中&#xff0c;image blending model将3D点映射回原图中求得&#xff0c;SH model通过模型预测求得…

【工具栏】热部署不生效

目录 配置热部署&#xff1a; 解决热部署不生效&#xff1a; 首先检查&#xff1a; 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 配置热部署&#xff1a; https://blog.csdn.net/m0_67930426/article/details/133690559 解决热部署不…

Python中的解析器argparse

import argparse## 构造解析器 argparse.ArgumentParser() parse argparse.ArgumentParser(description"caculateing the area of rectangle")## 添加参数 .add_argument() parse.add_argument("--length",typeint,default20,helpThe length of rectangle…

【追求卓越09】算法--散列表(哈希表)

引导 通过前面几个章节的学习&#xff08;二分查找&#xff0c;跳表&#xff09;&#xff0c;我们发现想要快速查找某一个元素&#xff0c;首先需要将所有元素进行排序&#xff0c;再利用二分法思想进行查找&#xff0c;复杂度是O(logn)。有没有更快的查找方式呢&#xff1f; 本…

微软发布最新.NET 8长期支持版本,云计算、AI应用支持再强化

11 月 15 日开始的为期三天的 .NET Conf 在线活动的开幕日上&#xff0c;.NET 8作为微软的开源跨平台开发平台正式发布。.NET 团队着重强调云、性能、全栈 Blazor、AI 和 .NET MAUI 是.NET 8的主要亮点。.NET团队在 .NET Conf 2023 [1]活动开幕式上表示&#xff1a;“通过这个版…

nginx 模块相关配置及结构理解

文章目录 模块配置结构模块配置指令先看一下 ngx_command_t 结构一个模块配置的demo简单模块配置的案例演示 模块上下文结构模块的定义 模块配置结构 Nginx中每个模块都会提供一些指令&#xff0c;以便于用户通过配置去控制该模块的行为。 Nginx的配置信息分成了几个作用域(sc…

使用注解的AOP编程

使用注解的AOP编程 当注解没有参数时 当使用注解进行面向切面编程&#xff08;AOP&#xff09;时&#xff0c;你可以按照以下步骤来实现&#xff1a; 步骤&#xff1a; 1. 创建自定义注解&#xff1a; 首先&#xff0c;创建自定义的注解&#xff0c;以便在代码中标记需要进…

Excel换不了行怎么解决?

方法一: 使用Alt Enter键 在Excel中&#xff0c;输入文字时按下回车键&#xff0c;光标将会移到下一个单元格&#xff0c;如果想要换行&#xff0c;可以尝试使用Alt Enter键。具体操作如下: 1.在单元格中输入文字; 2.想要换行时&#xff0c;在需要换行的位置按下Alt Enter键; 3…

延时任务定时发布,基于 Redis 与 DB 实现

目录 1、什么是延时任务&#xff0c;分别可以使用哪些技术实现&#xff1f; 1.2 使用 Redis 和 DB 相结合的思路图以及分析 2、实现添加任务、删除任务、拉取任务 3、实现未来数据的定时更新 4、将数据库中的任务数据&#xff0c;同步到 Redis 中 1、什么是延时任务&#xff…

网络运维与网络安全 学习笔记2023.11.23

网络运维与网络安全 学习笔记 第二十四天 今日目标 VRRP负载均衡、BFD原理与配置、BFD典型应用 DHCP工作原理、全局模式DHCP VRRP负载均衡 VRRP单组缺陷 每网段存在一个VRRP组&#xff0c;缺点如下&#xff1a; 主网关数据转发压力大 备份网关不转发任何数据 网络设备利用…

Hook技术(钩子技术)

HOOK&#xff08;钩子技术&#xff09; 这里的hook我理解的意思就是通过拦截指令&#xff0c;将指令换成自己想要的指令&#xff0c;从而做道绕过原本的程序指令&#xff0c;要修改这个指令&#xff0c;要用汇编技术&#xff0c;从二进制入手。 扩展&#xff1a; 木马病毒之…

git clone慢的解决办法

在网站 https://www.ipaddress.com/ 分别搜索&#xff1a; github.global.ssl.fastly.net github.com 得到ip&#xff1a; 打开hosts文件 sudo vim /etc/hosts 在hosts文件末尾添加 140.82.114.3 github.com 151.101.1.194 github.global-ssl.fastly.net 151.101.65.194 g…

外部网关协议_边界网关协议BGP

一.边界网关协议BGP的基本概念 边界网关协议(Border Gateway Protocol&#xff0c;BGP&#xff09;属于外部网关协议EGP这个类别&#xff0c;用于自治系统AS之间的路由选择协议。由于在不同AS内度量路由的“代价”(距离、带宽、费用等&#xff09;可能不同&#xff0c;因此对于…

elasticsearch 7安装

问题提前报 max virtual memory areas error max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 如果您的环境是Linux&#xff0c;注意要做以下操作&#xff0c;否则es可能会启动失败 1 用编辑工具打开文件/etc/sysctl.conf 2 …