Tag Archives: 重读

数据结构重读 – 表达式求值

例如对如下的表达式求值:

4+2*3-10/5,注意是有优先级顺序的。

我们首先定义算符优先关系如下表:

注意这个表和我们所掌握的算数定义不同,如+和-是的优先级关系不是同等。

其中,#为终止符。

接着,我们预定义两个辅助函数:

Precede(opr1, opr2),比较两个运算符opr1和opr2,如果opr1优先级大于opr2,返回'>',小于返回'<',相等返回'='。

 

我们使用两个栈模拟:OPTR存放寄存[......]

继续阅读

数据结构重读 - 括号匹配

检查括号匹配,形如如下的字符串:

[([][])] 认为是匹配的。

而[(][])这种认为是不匹配的。

算法很简单,就是栈:

(1)如果是左括号([{等,直接入栈(使得原有在栈中的所有未消解的期待括号的紧迫级别下降一位)。

(2)如果是右括号,比如],则栈顶要么是与它匹配的左括号如[,否则就是括号不匹配。

(3)如果所有字符串都处理完,栈是空的,则是匹配的,否则不匹配。

代码如下:
// 1 for succ, 0 for false
int kuo[......]

继续阅读

数据结构重读 – 栈的基本操作

栈是限定在只能在尾部操作(插入或删除)的线性表。

栈是按照后进先出的,LIFO。

一般来说,栈应该是无上限的,即如果栈满了,应该可以自动扩充。

定义如下的栈结构:
struct Stack
{
int* base;
int* top;
int size;
};
注意,top指向的不是栈顶而是栈顶的下一个元素!

当base==NULL或者top==base时,可以认为栈是空的。

基本操作有push、pop、top(取得栈顶元素但不弹出栈)、isem[......]

继续阅读

数据结构重读 - 一元多项式的表示及相加

一元多项式的表示及相加:

我们定义P(x)=p0+p1*x+p2*x^2...pn*x^n简写为P=(p0, p1, p2...pn)

再定义Q=(q0, q1, 12...qm)

现在要求R = P(X) + q(X),显然,实际上R=(p0+q0, p1+q1, p2+q2 .. pm+1, pn) 假设m<n。

这种应用场景,用顺序存储不合适,它虽然运算简单,但因为很有可能从1~1000次幂都是0,是稀疏的。因此,链表类似的存储更合适。

首先考虑加法,其[......]

继续阅读

数据结构重读 - 循环链表与双向链表

1、循环链表:链表中最后一个结点的指针域指向头结点,整个链表形成一个环。
(1)一般要设置尾指针,方便操作。
(2)从表中任意一个结点出发均可以到达其他任意结点。
(3)两个链表合并为新链表是很方便,只需要把第一个尾指针和第二个的头指针连接起来就好了。

下面是循环链表的基本操作:

2、双向链表:在结点中有两个指针域,一个后继、一个前趋。
(1)特性:d->next->pre == d->pre->next == d
(2)插入、删除时都要操作两个指针[......]

继续阅读