这两周学习了数据结构中的栈和队列
简单的复习一下,他们都是很重要的线性结构,其中栈的结构是后进先出,而队列就是像排队一样先进先出,后进后出。
从书中得到代码,栈的存储结构及各种方法
typedef struct
{
ElemType *base;
ElemType *top;
int stackSize;
}sqStack;
//----- 栈的动态分配顺序存储结构 -----
#define STACK_INIT_SIZE 100 //顺序栈初始容量
#define STACKINCREMENT 10 //顺序栈容量增量
typedef struct {
SElemType *base; //顺序栈基地址(栈底指针)
SElemType *top; //栈顶指针
int stacksize; //顺序栈当前存储容量
}SqStack;
//----- 基本操作的算法描述 -----
Status InitStack( SqStack &S ) {
// 构造一个空栈 S
S.base=(SElemType*)malloc
(STACK_INIT_SIZE*sizeof(SElemType));
if (!S.base) exit(OVERFLOW); // 存储分配失败
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}//InitStack
Status GetTop( SqStack S, SElemType &e ) {
// 若栈不空,则用 e 返回 S 的栈顶元素,并返回 OK;
// 否则返回 ERROR
if (S.top = = S.base) return ERROR;
e = *(S.top-1);
return OK;
}//GetTop
Status Push( SqStack &S, SElemType e ) {
// 在栈 S 中插入元素 e 为新的栈顶元素
if (S.top-S.base>=S.stacksize) { // 栈满,追加存储空间
newbase=(SElemType*)realloc(S.base,
(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if (!newbase) exit(OVERFLOW); // 存储分配失败
S.base = newbase;
S.top = S.base+S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK;
}//Push
Status Pop( SqStack S, SElemType &e ) {
// 若栈不空,则删除 S 的栈顶元素,用 e 返回其值,
// 并返回 OK; 否则返回 ERROR
if (S.top = = S.base) return ERROR;
e = *--S.top;
return OK;
}//Pop
队列既可以用链表实现,也可以用顺序表实现。
跟栈相反的是,栈一般我们用顺序表来实现,而队列我们常用链表来实现,简称为链队列。
//队列的链式表示和实现
typedef struct QNode{
ElemType data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct{
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
}LinkQueue;
其他的方法和栈类似,C中直接用stack或queue构造就可以用这两个数据类型了!在有相关题型时特别方便。