数据结构与算法——栈的应用

栈的特点是后进先出,所以常用来处理具有递归结构的数据 深度优先搜索 表达式求值 子程序 / 函数调用的管理 消除递归 表达式的递归定义 基本符号集:${0,1,…,9,+,-,*,/,(,)}$ 语法成分集:{<表达式> , <项> , <因子> , <常数>, <数字> } 中缀表达式:$23\ +\ (34\ *\ 45)\ /\ (5\ +\ 6\ +\ 7)$ 后缀表达式:$23\ 34\ 45\ *\ 5\ 6\ +\ 7\ +\ /\ +$ 中缀表达式 运算符在中间 需要括号改变优先级 例如:$4\ *\ x\ *\ (2\ *\ x\ +\ a)\ –\ c$ 后缀表达式...

April 4, 2022 · 2 min · Rick Cui

数据结构与算法——栈的实现方式

栈的物理实现有 顺序栈 和 链式栈 一、顺序栈(Array-based Stack) 使用向量实现,本质上是顺序表的简化版 栈有固定大小 关键是确定哪一端作为栈顶 注意上溢、下溢问题 类定义: template <class T> class arrStack : public Stack <T> { private: // 栈的顺序存储 int mSize; // 栈中最多可存放的元素个数 int top; // 栈顶位置,应小于mSize T *st; // 存放栈元素的数组 public: // 栈的运算的顺序实现 arrStack(int size) { // 创建一个给定长度的顺序栈实例 mSize = size; top = -1; st = new T[mSize]; } arrStack() { // 创建一个顺序栈的实例 top = -1; } ~arrStack() { delete [] st; } void clear() { top = -1; } // 清空栈 }; bool arrStack<T>::push(const T item) { // 入栈 if (top == mSize-1) { // 栈已满 cout << "栈满溢出" << endl; return false; } else { // 新元素入栈并修改栈顶指针 st[++top] = item; return true; } } bool arrStack<T>::pop(T& item) { // 出栈 if (top == -1) { // 栈为空 cout << "栈为空,不能执行出栈操作"<< endl; return false; } else { item = st[top--]; // 返回栈顶,并缩减1 return true; } } 二、链式栈(Linked Stack) 用单链表方式存储,其中指针的方向是从栈顶向下链接 理论上没有大小限制 类定义:...

April 3, 2022 · 2 min · Rick Cui

数据结构与算法——栈

一、栈 后进先出 是一种限制访问端口的线性表 主要操作 进栈(push) 出栈(pop) 应用 表达式求值(中缀表达式、后缀表达式) 消除递归 深度优先搜索(树、图) 二、栈的抽象数据类型 template <class T> class Stack { public: // 栈的运算集 void clear(); // 变为空栈 bool push(const T item); // item入栈,成功返回真,否则假 bool pop(T& item); // 返回栈顶内容并弹出,成功返回真,否则假 bool top(T& item); // 返回栈顶但不弹出,成功返回真,否则假 bool isEmpty(); // 若栈已空返回真 bool isFull(); // 若栈已满返回真 }; 三、思考题 若入栈顺序为 1,2,3,4 的话,则出栈的顺序可以有哪些?...

March 31, 2022 · 1 min · Rick Cui

Emscripten——使用 WebIDL Binder 绑定 C++ 代码

WebIDL Binder 提供一种简单、轻量级的方法来绑定 C++ 代码。 WebIDL Binder 使用 WebIDL 定义了一种 接口语言 来把 C++ 和 JavaScript 粘合在一起。 该绑定器支持可以用 WebIDL 表达的 c++ 类型的子集。这个子集对于大多数情况来说已经足够了。 接下来,通过一个简单的例子来看一下绑定的流程,使用 WebIDL Binder 进行绑定的过程分为三个阶段: 创建一个 WebIDL 文件,用来描述 C++ 接口; 使用绑定器生成 C++ 和 JavaScript 的胶水代码; 使用 EMScripten 编译此胶水代码; 第一步:创建 WebIDL 接口文件 创建一个描述将要绑定的 C++ 类型的 WebIDL 接口文件。该文件将复制 C++ 头文件中的一些信息。比如,我们想绑定下面的 C++ 类(my_classes.h): class Foo { public: int getVal(); void setVal(int v); private: int m_val{0}; }; class Bar { public: Bar(long val); ~Bar(); void doSomething(); private: int m_val; }; IDL 接口文件就可以写成下面的形式(my_classes....

March 29, 2022 · 3 min · Rick Cui

Emscripten——C++ 调用 Js 回调函数

WASM 调用 js 代码 Emscripten 提供了两种方式,用于从 C/C++ 调用 JavaScript 的方法: 使用 emscripten_run_script() 运行脚本 编写 inline JavaScript。 最直接但稍微慢的方式是使用 emscripten_run_script()。这有效地使用 eval() 在 C/C++ 中运行指定的 JavaScript 代码。例如,调用浏览器的 alert() 函数,例如下面的代码: int EMSCRIPTEN_KEEPALIVE runScript(){ emscripten_run_script("alert('hi')"); emscripten_run_script("console.log('hello world!')"); return 0; } 从 C 中调用 JavaScript 接口的一种更快的方法是编写 inline JavaScript,使用 EM_JS() 或 EM_ASM() (以及其它相关的宏)。 EM_JS 是在 C 文件中声明一个 JavaScript 函数,使用方法参考这里。 #include <emscripten.h> EM_JS(void, myAlert, (), { alert('hello world!'); throw 'all done'; // exception }); EM_JS(void, take_args, (int x, float y), { console....

March 26, 2022 · 2 min · Rick Cui