其实这个困扰了我很久……
一般情况下,我们是这么读文件的:
for line in open("xxx"):
print line
但是有时候,我们想自己控制读取每一行,即open得到fp后,readline(),何时是退出呢?
经过查找N多文档,得到一种很隐晦的说法是当返回空串时表示退出。
于是写法是:
fp = ....
while True:
line = fp.readline()
if len(line)==0[......]
其实这个困扰了我很久……
一般情况下,我们是这么读文件的:
for line in open("xxx"):
print line
但是有时候,我们想自己控制读取每一行,即open得到fp后,readline(),何时是退出呢?
经过查找N多文档,得到一种很隐晦的说法是当返回空串时表示退出。
于是写法是:
fp = ....
while True:
line = fp.readline()
if len(line)==0[......]
例如对如下的表达式求值:
4+2*3-10/5,注意是有优先级顺序的。
我们首先定义算符优先关系如下表:
注意这个表和我们所掌握的算数定义不同,如+和-是的优先级关系不是同等。
其中,#为终止符。
接着,我们预定义两个辅助函数:
Precede(opr1, opr2),比较两个运算符opr1和opr2,如果opr1优先级大于opr2,返回'>',小于返回'<',相等返回'='。
我们使用两个栈模拟:OPTR存放寄存[......]
检查括号匹配,形如如下的字符串:
[([][])] 认为是匹配的。
而[(][])这种认为是不匹配的。
算法很简单,就是栈:
(1)如果是左括号([{等,直接入栈(使得原有在栈中的所有未消解的期待括号的紧迫级别下降一位)。
(2)如果是右括号,比如],则栈顶要么是与它匹配的左括号如[,否则就是括号不匹配。
(3)如果所有字符串都处理完,栈是空的,则是匹配的,否则不匹配。
代码如下:
// 1 for succ, 0 for false
int kuo[......]
先看一下手工模拟的进制转换,例如10进制转8进制:
N N / 8 N mod 8
1348 168 4
168 21 0
21 2 5
2 0 2
(1348)10 = (2504)8
上述过程很明显了:进制转换就是逐步摸、除之后[......]
栈是限定在只能在尾部操作(插入或删除)的线性表。
栈是按照后进先出的,LIFO。
一般来说,栈应该是无上限的,即如果栈满了,应该可以自动扩充。
定义如下的栈结构:
struct Stack
{
int* base;
int* top;
int size;
};
注意,top指向的不是栈顶而是栈顶的下一个元素!
当base==NULL或者top==base时,可以认为栈是空的。
基本操作有push、pop、top(取得栈顶元素但不弹出栈)、isem[......]