915栈和队列部分参考代码,完整见PPT

2023-10-29 14:10

本文主要是介绍915栈和队列部分参考代码,完整见PPT,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

顺序栈的定义

int stk[N], top = -1;

具体操作见PPT。


链栈

1. 节点定义

链栈的节点通常定义如下:

struct Node 
{int val;Node *next; Node(int x) : val(x), next(NULL) {}
};

其中:

  • val 字段保存节点存储的数据
  • next 字段指向下一个节点,实现链式存储结构

链栈的基本操作需要使用链表的基本操作,如:

  • 初始化一个链栈常用头结点法,建立一个头结点,它的next指针初始化为NULL
  • 插入节点时,新建一个节点,将它的next指向原来栈顶节点,然后将栈顶指针指向新节点
  • 删除节点时,将栈顶指针指向原栈顶的next节点,释放原栈顶节点空间
  • 访问栈顶元素直接通过栈顶指针访问其val字段
  • 判断是否为空使用栈顶指针是否为NULL等

总之,通过next指针链接节点,实现链式存储,同时使用栈顶指针指向实际栈顶节点,就可以实现链栈的基本操作。

2. 初始化

链栈的初始化主要有两种方式:

  1. 初始化一个头结点
Node *init()    
{Node *dummy = new Node(-1);return dummy;
}

此时头结点仅代表栈的头,不存储实际数据,next指针初始化为NULL表示栈为空。

  1. 不使用头结点
Node *init() 
{return NULL;
}

此时为空栈直接返回NULL。

使用头结点的优点是:

  • 代码实现更简单,操作时直接使用 head指针代表栈 Head
  • 判断栈空时用head->next判断,避免每次都对NULL指针进行判断

不使用头结点可以减少一个额外的结点开销。

一般来说,使用头结点法是较为常见的链栈初始化实现方式。它简化了空栈的判断及后续的插入、删除等操作。

所以使用头结点法初始化一个链栈一般是最佳实践。

接下来的写法都是基于带头节点的链表来实现。

3. 判栈空
bool empty(Node *dummy)
{return dummy->next == NULL;
}
4. 进栈
void push(Node *dummy, int x)
{Node *node = new Node(x);node->next = dummy->next;dummy->next = node;
}
5. 出栈
// 为了使代码简洁突出原理,以下所有操作默认都是合法的
void pop(Node *dummy)
{dummy->next = dummy->next->next;
}
6. 读栈顶元素
int top(Node *dummy)
{return dummy->next->val;
}
完整代码
#include <iostream>using namespace std;struct Node
{int val;Node *next;Node(int x) : val(x), next(NULL) {}
};// 链栈初始化
Node *init()    
{Node *dummy = new Node(-1);return dummy;
}bool empty(Node *dummy)
{return dummy->next == NULL;
}void push(Node *dummy, int x)
{Node *node = new Node(x);node->next = dummy->next;dummy->next = node;
}// 为了使代码简洁突出原理,以下所有操作默认都是合法的
void pop(Node *dummy)
{dummy->next = dummy->next->next;
}int top(Node *dummy)
{return dummy->next->val;
}// 出栈链表剩余元素并输出
void print(Node *dummy)
{while (!empty(dummy)){cout << top(dummy) << ' ';pop(dummy);}cout << endl;
}int main()  
{// 测试链栈各操作Node *dummy = init();push(dummy, 1);push(dummy, 2);push(dummy, 3);push(dummy, 4);printf("栈顶元素:%d\n", top(dummy));pop(dummy);printf("栈顶元素:%d\n", top(dummy));printf("栈是否为空:%d\n", empty(dummy));print(dummy);return 0;
}
栈顶元素:4
栈顶元素:3
栈是否为空:0
3 2 1 

在这里插入图片描述

在这里插入图片描述

class MyQueue {
private:stack<int> in, out;void in2out() {while (!in.empty()) {out.push(in.top());in.pop();}}
public:MyQueue() {}void push(int x) {in.push(x);}int pop() {if (out.empty()) {in2out();}int res = out.top();out.pop();return res;}int peek() {if (out.empty()) {in2out();}return out.top();}bool empty() {return out.empty() && in.empty();}
};/*** Your MyQueue object will be instantiated and called as such:* MyQueue* obj = new MyQueue();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->peek();* bool param_4 = obj->empty();*/

在这里插入图片描述
在这里插入图片描述

class MyStack {
private:queue<int> q1, q2;public:MyStack() {}void push(int x) {q2.push(x);while (!q1.empty()) {q2.push(q1.front());q1.pop();}swap(q1, q2);}int pop() {int res = q1.front();q1.pop();return res;}int top() {return q1.front();}bool empty() {return q1.empty();}
};/*** Your MyStack object will be instantiated and called as such:* MyStack* obj = new MyStack();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->top();* bool param_4 = obj->empty();*/

在这里插入图片描述

class MyStack {
private:queue<int> q;public:MyStack() {}void push(int x) {int n = q.size();q.push(x);while (n --) {q.push(q.front());q.pop();}}int pop() {int res = q.front();q.pop();return res;}int top() {return q.front();}bool empty() {return q.empty();}
};/*** Your MyStack object will be instantiated and called as such:* MyStack* obj = new MyStack();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->top();* bool param_4 = obj->empty();*/

括号匹配

这个代码利用STL的stack来实现:

  • 遍历字符串,遇到开括号入栈
  • 遇到闭括号出栈与之比对
  • 最后判断栈是否为空,为空则括号匹配

通过给出具体代码,可以更清晰体现栈在括号匹配中的应用。

#include <iostream>
#include <stack>using namespace std;bool bracketMatch(string str)
{stack<char> s;for (char c: str){if (c == '(' || c == '[' || c == '{') s.push(c);else{if (s.empty()) return false;char top = s.top();s.pop();if ((c==')' && top!='(') ||(c==']' && top!='[') ||(c=='}' && top!='{')) return false;}}return s.empty();
}int main()
{string s1 = "((()))";string s2 = "([{{}])";if(bracketMatch(s1))cout << "s1 matched" << endl;elsecout << "s1 not matched" << endl;if(bracketMatch(s2))cout << "s2 matched" << endl;elsecout << "s2 not matched" << endl;return 0;
}

AcWing.3302中缀表达式求值:

2种解法:

  1. 直接求解

  2. 将中缀表达式转换为后缀表达式后进行解决

完整代码链接:https://www.acwing.com/activity/content/code/content/1466076/

冲击高分的同学需要掌握具体代码的实现

冲击平均分的同学只需理解算法

这里给出第二种解法的参考代码:

在这里插入图片描述

#include <iostream>
#include <stack>
#include <string>using namespace std;// 操作符优先级
int priority(char op) {if(op == '+' || op == '-')return 1;else if(op == '*' || op == '/') return 2;else return 0;
}string infixToPostfix(string infix) {stack<char> st;string postfix;for(char c: infix) {if(c == ' ') continue; //跳过空格if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) { // c是字母// if(isdigit(c)) {  // c是具体的数字postfix += c; //操作数直接加入后缀表达式}else if(c == '(') {st.push(c); //左括号入栈}else if(c == ')') {while(!st.empty() && st.top() != '(') {postfix += st.top();st.pop();}if(!st.empty() && st.top() != '(') {return "Invalid Expression"; }st.pop(); //弹出左括号}else { //运算符while(!st.empty() && priority(c) <= priority(st.top())) {postfix += st.top();st.pop();  }st.push(c);}}while(!st.empty()) {if(st.top() == '(') return "Invalid Expression";postfix += st.top();st.pop();}return postfix;
}int main() {string infix;cin >> infix;string postfix = infixToPostfix(infix);cout << postfix << endl;return 0;
}

输入:

(a+b)*(c+d)

输出:

ab+cd+*

这篇关于915栈和队列部分参考代码,完整见PPT的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/301178

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2431 poj 3253 优先队列的运用

poj 2431: 题意: 一条路起点为0, 终点为l。 卡车初始时在0点,并且有p升油,假设油箱无限大。 给n个加油站,每个加油站距离终点 l 距离为 x[i],可以加的油量为fuel[i]。 问最少加几次油可以到达终点,若不能到达,输出-1。 解析: 《挑战程序设计竞赛》: “在卡车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站i时,就获得了一

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d