栈ADT
initStack(&S):初始化一个空栈
StackEmpty(S):判断栈是否为空
Push(&S,x):进栈
Pop(&S,&x):出栈
GetTop(S,&x):读取栈顶元素
ClearStack(&S):销毁栈
如果考虑的是栈顶指针与元素之间的关系的话:
如果栈顶指针是指向栈顶元素的,那么:先移动栈顶指针,然后元素入栈
如果栈顶指针是指向元素的下一位的,那么:先将元素入栈,然后移动栈顶指针
100C
1000H后面的H是表示16进制
16进制:0~9,代表对应的数字,A(10) ~ B(11) ~C(12) ~D(13) ~E(14) ~F(15) 也就是0~9共10个数字,加上A~F一共6个数字
1000H就转换为:1 * 16^3
1000(16进制)如果加上12的话,也就是100C
分别是:34215,34521,34251
这里的top是指向栈顶元素,当栈为空的时候,top指向0 if(top != n){
data[++top] = x;
}
.为分隔符
注意:如果遇到优先级相同的,需要出栈,而且是连续出栈
a/(b-c) + d * e
后缀表达式求值:
1,从左到右扫描后缀表达式
2,遇到数字就进栈,操作符不进栈
3,如果遇到操作符,就从栈顶取两个元素,先取出的那个元素作为右操作数,后取出的作为左操作数,将计算结果压入栈中
4,持续进行上述步骤
减法运算(3-1) 加法运算(2 + 10) 方法与后缀表达式的计算非常像(都是从左到右扫描,如果遇到操作符,就从栈顶去两个元素,先取出的是右操作数,计算完之后,将结果压入操作数栈中)
注意:如果遇到操作符栈为(+/)(从栈底 到栈顶),而待入栈的运算符为+,则需要先将/出栈,计算,然后将计算结果入栈,然后遇到相同操作符了,继续出栈,然后计算,将结果入栈,最后再将待入栈的+入栈
可以通过输出计算过程的式子,与原式进行比较
队列ADT :
InitQueue(&Q):初始化队列,构造一个空队列Q
QueueEmpty(Q):判队列空,如果队列Q为空返回true,否则返回false
EnQueue
1)牺牲一个存储单元来区分队满和队空
2)元素节点类型中增设表示元素个数的数据成员,当front==rear的时候,如果Q.size==0,则为队空,如果Q.size=MaxSize,则为队满
3)类型中增设标志位tag,来区分队满还是队空,tag==0,如果因删除导致Q.front == Q.rear,则为队空,tag==1的情况下,如果因插入导致Q.front == Q.rear则为队满
就等于(rear-front+lengthOfArray) % lengthOfArray
(rear-front+m)%m
当前队列的长度为: (rear-front+Q) % Q == 6
一共有1000个元素,牺牲一个元素用于标识是否为满和空,一共有1000-6-1==993个元素ss