一、栈和队列的基本概念
1.栈是一种线性表无疑。一般提供两种操作:入栈(PUSH) 和出栈( POP)。分别对应着数据插入和数据删除。
队列的话,也是一种线性表。和栈不同的是,栈只能在栈顶操作(PUSH&POP),而队列被限制为从一端入,从另一端出。
这里的栈和队列指的都是最一般的情况。
2.栈是先进后出的(First In Last Out, FILO),队列是先进先出的(First In First Out, FIFO)。
从真题来看,这部分题考概念的比较简单。
二、栈和队列的顺序存储结构
1、顺序栈
1 //定义 2 typedef struct 3 { 4 int data[max_size];//比如 int data[100]; 5 int top; //栈顶 6 }SqStack;
考试的时候,简单的可以这么写
1 int myStack[max_size];//例如int myStack[1000]; 2 int top = -1; 3 4 //Push key 5 myStack[++top] = key; 6 //POP 7 key = myStack[top--];
2、顺序队
1 typedef struct 2 { 3 int data[max_size]; 4 int front; 5 int rear; 6 }SqQueue;
3、循环队列
front和rear循环。
rear不能超过front一圈。
这部分内容比较绕的就是循环队列,还有就是队头队尾的位置判断,还有对队列为空和为满的判断。
三、栈和队列的链式存储结构
1、栈 链式实现
1 typedef struct LNode 2 { 3 int data; 4 struct LNode *next; 5 }LNode, *LinkStack; 6 7 //PUSH 8 newLNode->data = key; 9 newLNode->next = headLNode->next; 10 headLNode->next = newLNode; 11 12 //POP 13 temp = headLNode->next; 14 key = temp->data; 15 headLNode->next = temp->next; 16 free(temp);
2、队列 链式实现
1 typedef struct QNode 2 { 3 int data; 4 int QNode *next; 5 }QNode; 6 7 typedef struct 8 { 9 QNode *front; 10 QNode *rear; 11 }LinkQueue; 12 13 //入队 14 lqu->rear->next = p; 15 lqu->rear = p; 16 //出队 17 p = lqu->front; 18 lqu->front = p->next; 19 key = p->data; 20 free(p);
四、栈和队列的应用
栈的话,很常规的一个东西就是表达式计算。
队列的话,CPU资源竞争的问题、主机和打印机之间的协调等等。
五、特殊矩阵的压缩存储
1、对称阵A压缩到SA[n(n+1)/2];
2、三角矩阵A压缩到SA[n(n+1)/2];
3、对角矩阵