20-有效的括号

思路:主要考察栈的一些基本操作,像push()(将数据压入栈顶)、top()(取栈顶的数据但不删除)、pop()(直接删除栈顶的元素)、empty()(判断栈是否为空)。这题就是先把三种括号类型的左边先入栈,然后再判断后面紧接着进入的是否是同类型匹配。

class Solution {
public:
bool isValid(string s) {
stack<char> p;
for(int i=0;i<s.size();i++){
if(s[i]=='('||s[i]=='{'||s[i]=='[')
p.push(s[i]);
else{
if(p.empty()) return false;
if(s[i]==')'&&p.top() != '(') return false;
if(s[i]=='}'&&p.top() != '{') return false;
if(s[i]==']'&&p.top() != '[') return false;
p.pop();
}
}
return p.empty();
}
};

150-逆波兰表达式

思路:逆波兰,把运算符放在两个数后面进行运算的表达式。可以想到使用栈解决时能够把遇到的数字都压入栈中,遇到符号则拿出来计算,然后再把结果压入栈中。

class Solution {
public:
int evalRPN(vector<string>& tokens) {
if(tokens.size()==1)
return stoi(tokens[0]);
stack<int> st; for(int i=0;i<tokens.size();i++){
if(tokens[i]!="+"&&tokens[i]!="-"&&tokens[i]!="*"&&tokens[i]!="/"){
st.push(stoi(tokens[i]));
}else{
int num1=st.top();st.pop();
int num2=st.top();st.pop();
if(tokens[i]=="+") st.push(num2+num1);
if(tokens[i]=="-") st.push(num2-num1);
if(tokens[i]=="*") st.push(num2*num1);
if(tokens[i]=="/") st.push(num2/num1);
}
}
return st.top();
}
};

71-简化路径

思路:

  1. 是“..”时删掉它上面紧挨着的一个路径;
  2. 中间是"."时直接去掉;
  3. 如果是空,则直接返回“/”;
  4. 如果是多个“/”,只保留一个;
  5. 路径可以看做是一个或多个"/"分隔开众多子字符串
class Solution {
public:
string simplifyPath(string path) {
vector<string> v;
int i=0;
while(i<path.size()){
while(path[i]=='/'&&i<path.size()) i++;
if(i==path.size()) break;
int start=i;
while(path[i]!='/'&&i<path.size()) i++;
int end=i-1;
string s=path.substr(start,end-start+1);
if(s==".."){
if(!v.empty()) v.pop_back();
}else if(s!="."){
v.push_back(s);
}
}
if(v.empty()) return "/";
string res;
for(int i=0;i<v.size();i++){
res +='/'+v[i];
}
return res;
}
};

126-单词接龙

思路:有点难理解。。

347-前K个高频词汇

思路:统计出现数字的频次考虑用HashMap,建立数字和其出现次数的映射,然后按照次数排序,然后按照最大堆来从大到小排序。

class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> m;
priority_queue<pair<int, int>> q;
vector<int> res;
for(auto a:nums)
m[a]++;
for(auto it:m)
q.push({it.second,it.first});
for(int i=0;i<k;i++){
res.push_back(q.top().second);
q.pop();
}
return res;
}
};

23-合并K个排序链表

思路:K个链表先划分为合并K/2个链表,再不停地往下划分,直到划分成只有一个或者两个链表的任务。k通过(n+1)/2的目的是可以确保取值为奇数时能从后半段开始,当然为偶数的时候不会存在影响。

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.empty())
return NULL;
int n=lists.size();
while(n>1){
int k=(n+1)/2;
for(int i=0;i<n/2;i++){
lists[i]=mergeTwolists(lists[i],lists[i+k]);
}
n=k;
}
return lists[0];
} ListNode* mergeTwolists(ListNode* l1,ListNode* l2){
ListNode* p=new ListNode(-1),*cur=p;
while(l1&&l2){
if(l1->val<l2->val){
cur->next=l1;
l1=l1->next;
}else{
cur->next=l2;
l2=l2->next;
}
cur=cur->next;
}
if(l1) cur->next=l1;
if(l2) cur->next=l2;
return p->next;
}
};

  

leetcode上的一些栈、队列问题的更多相关文章

  1. LeetCode刷题总结-栈、链表、堆和队列篇

    本文介绍LeetCode上有关栈.链表.堆和队列相关的算法题的考点,推荐刷题20道.具体考点分类如下图: 一.栈 1.数学问题 题号:85. 最大矩形,难度困难 题号:224. 基本计算器,难度困难 ...

  2. Leetcode栈&队列

    Leetcode栈&队列 232.用栈实现队列 题干: 思路: 栈是FILO,队列是FIFO,所以如果要用栈实现队列,目的就是要栈实现一个FIFO的特性. 具体实现方法可以理解为,准备两个栈, ...

  3. 关于Leetcode上二叉树的算法总结

    二叉树,结构很简单,只是比单链表复杂了那么一丢丢而已.我们先来看看它们结点上的差异: /* 单链表的结构 */ struct SingleList{ int element; struct Singl ...

  4. 栈&队列&并查集&哈希表(julyedu网课整理)

    date: 2018-11-25 08:31:30 updated: 2018-11-25 08:31:30 栈&队列&并查集&哈希表(julyedu网课整理) 栈和队列 1. ...

  5. 栈 & 队列

    栈 先进者后出,后进者先出,LIFO,典型的"栈"结构 从栈的操作特性上来看,栈是一种"操作受限"的线性表,只允许在一段插入和删除数据. 在功能上来说,数组和链 ...

  6. java 集合 Connection 栈 队列 及一些常用

    集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...

  7. 如何限制一个类只在堆上分配和栈上分配(StackOnly HeapOnly)

    [本文链接] http://www.cnblogs.com/hellogiser/p/stackonly-heaponly.html [题目] 如何限制一个类只在堆上分配和栈上分配? [代码]  C+ ...

  8. leetcode Maximal Rectangle 单调栈

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4052721.html 题目链接:leetcode Maximal Rectangle 单调栈 ...

  9. 关于LeetCode上链表题目的一些trick

    最近在刷leetcode上关于链表的一些高频题,在写代码的过程中总结了链表的一些解题技巧和常见题型. 结点的删除 指定链表中的某个结点,将其从链表中删除. 由于在链表中删除某个结点需要找到该结点的前一 ...

随机推荐

  1. LINK : fatal error LNK1561: 必须定义入口点

    转自VC错误:http://www.vcerror.com/?p=1313 问题描述: 错误:LINK : fatal error LNK1561: 必须定义入口点 解决方法: 详细的解决方法可参考V ...

  2. GPIO 的 8 种工作模式

    GPIO 的 8 种工作模式 在初始化 GPIO 的时候,根据我们的使用要求,必须把 GPIO 设置为相应的模式.如 LED 例程中的 GPIO 引脚如果配置为模拟输入模式是必然会导致错误的. 我们配 ...

  3. 彻底搞定C指针-函数名与函数指针

     函数名与函数指针 一 通常的函数调用 一个通常的函数调用的例子://自行包含头文件 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int mai ...

  4. Java并发:搞定线程池(上)

    原文地址:https://www.nowcoder.com/discuss/152050?type=0&order=0&pos=6&page=0 本文是在原文的基础+理解,想要 ...

  5. day 90 RBAC

    参考博客 -陈晓梅 http://www.cnblogs.com/c-x-m/p/9025478.html 登录view from django.shortcuts import render,red ...

  6. Appium移动端自动化:Api接口详解

    滑动操作与拖拽操作 # 滚动处理 # elementObj1 目标滚动元素,elementObj2 起始滚动元素 # 底层通过action操作,与web ui相反,origin_el为目标元素,des ...

  7. jmeter中如何使用csv文件并读取数据

    我现在要测试一个新的网站,需要负载测试这个功能“加入购物车”.要做到 这一点,我需要模拟多个用户登录并进行购物操作,具体的场景为每一个人将同样的物品加入到购物车. JMeter 处理这些请求完全没有问 ...

  8. lua脚本分解字符串

    --local str = "文字45 文字 789 文们adsd45 文字 wowo 文字 文字 wowo我们 wowo456 wiwo 465我们 456sdf 45 45我们adsd4 ...

  9. JavaScript DOM编程艺术-第一章

    发现基础不是很好,补习一下.37买了2本书(dom编程和高级程序设计). 以前读书总是自己勾勾画画,有点没意思.现在写下来,说不定会成为传世经典.哈哈...........随便扯扯淡. 第一天(201 ...

  10. idea配置svn正确步骤(下载svn的过程就不写了)

    打开----->File------>Settings 2. 3在vcs中选择 4进入此界面 5选择 这样svn就配置好了