赞
踩
ADT 栈(Stack)
Data
具有线性表一样的性质。
Operation
top:获取栈顶元素
count:栈的长度
isEmpty:栈内元素是否为空
push(data):元素进栈
pop():元素出栈
removeAll():清空栈内元素
EndADT
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OK 1
#define MAXSIZE 20 /* 存储空间初始分配量 */
typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */
/* 顺序栈结构 */
typedef struct {
ElemType data[MAXSIZE];
int top; /* 用于栈顶指针 */
}Stack;
Status InitStack(Stack *S) {
S->top = -1;
return OK;
}
Status ClearStack(Stack *S) {
S->top = -1;
return OK;
}
Status GetTop(Stack S, ElemType *e) {
if (S.top == -1) return ERROR;
*e = S.data[S.top];
return OK;
}
int StackLength(Stack S) {
return S.top+1;
}
Status PushStack(Stack *S, ElemType e) {
if (S->top == MAXSIZE -1) return ERROR;
S->top++;
S->data[S->top] = e;
return OK;
}
Status PopStack(Stack *S, ElemType *e) {
if (S->top == -1) {
return ERROR;
}
*e = S->data[S->top];
S->top--;
return OK;
}
int main(int argc, const char * argv[]) { // 创建栈 Stack S; InitStack(&S); for (int i = 0; i < 10; i++) { PushStack(&S, i); } StackPrint(S); // 出栈 ElemType e; PopStack(&S, &e); printf("出栈:%d",e); StackPrint(S); // 获取栈顶元素 GetTop(S, &e); printf("栈顶:%d\n",e); // 输出长度 printf("栈长度:%d\n",StackLength(S)); return 0; }
栈
0 1 2 3 4 5 6 7 8 9
出栈:9
栈
0 1 2 3 4 5 6 7 8
栈顶:8
栈长度:9
#define ERROR 0 #define TRUE 1 #define FALSE 0 #define OK 1 typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */ typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */ /* 链栈的每一个节点,和单链表很像有没有 */ typedef struct StackNode { ElemType data; struct StackNode *next; }StackNode; typedef struct StackNode * StackNodePtr; /* 栈结构 */ typedef struct { StackNodePtr top; int count; }LinkStack;
Status InitStack(LinkStack *S) {
S->top = NULL;
S->count = 0;
return OK;
}
Status ClearStack(LinkStack *S) {
if (S->top == NULL) return ERROR;
StackNodePtr p;
while (S->count != 0) {
p = S->top;
S->top = S->top->next;
free(p);
S->count--;
}
return OK;
}
Status GetTop(LinkStack S, ElemType *e) {
if (S.top == NULL) return ERROR;
// if (S->count == 0) return ERROR; // 也可以
*e = S.top->data;
return OK;
}
int StackLength(LinkStack S) {
return S.count;
}
Status PushStack(LinkStack *S, ElemType e)
{
// 创建新元素
StackNodePtr p = (StackNodePtr)malloc(sizeof(StackNode));
if (p == NULL) return ERROR;
p->data = e;
p->next = S->top;
S->top = p;
S->count++;
return OK;
}
Status PopStack(LinkStack *S, ElemType *e) {
if (S->top == NULL) return ERROR;
// if (S->count == 0) return ERROR; // 也可以
/* 将栈顶指针指向新的栈顶 */
StackNodePtr temp = S->top;
S->top = S->top->next;
*e = temp->data;
free(temp);
S->count--;
return OK;
}
nt main(int argc, const char * argv[]) { // 创建栈 LinkStack S; InitStack(&S); for (int i = 0; i < 10; i++) { PushStack(&S, i); } StackPrint(S); ElemType e; PopStack(&S, &e); printf("出栈:%d\n",e); StackPrint(S); // 获取栈顶元素 GetTop(S, &e); printf("栈顶:%d\n",e); // 输出长度 printf("栈长度:%d\n",StackLength(S)); return 0; }
9 8 7 6 5 4 3 2 1 0
出栈:9
8 7 6 5 4 3 2 1 0
栈顶:8
栈长度:9
ADT 队列(Queue)
Data
具有线性表一样的性质。
Operation
front:队列第一个数据
count:队列的长度
isEmpty():队列是否为空
enQueue(data):数据进队列
deQueue():数据出队列
removeAll():清空队列内的所有数据
EndADT
#define ERROR 0 #define TRUE 1 #define FALSE 0 #define OK 1 typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */ typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */ typedef struct QueueNode { ElemType data; struct QueueNode *next; } QueueNode, *QueueNodePtr; typedef struct { QueueNodePtr front; QueueNodePtr rear; } LinkQueue;
// 初始化Status
InitQueue(LinkQueue *Q) {
// 初始队列为空,只有头节点,不是有效数据的节点
*Q->front = *Q->rear = (QueueNodePtr)malloc(sizeof(QueueNode));
if (*Q->front == NULL) return ERROR;
// 头节点的后面为空
*Q->front->next = NULL;
return OK;
}
// 判断是否为空Status
QueueEmpty(LinkQueue Q) {
if (Q.front == Q.rear) return TRUE;
return FALSE;
}
Status EnQueue(LinkQueue *Q, ElemType e) {
QueueNodePtr p = (QueueNodePtr)malloc(sizeof(QueueNode));
if (p == NULL) return ERROR;
p->data = e;
p->next = NULL;
// 追加到队尾
*Q->rear->next = p;
// 标记成队尾
*Q->rear = p;
return OK;
}
Status DeQueue(LinkQueue *Q, ElemType *e) { if (QueueEmpty(*Q)) return ERROR; QueueNodePtr head; // 找到要删除的节点 head = *Q->front->next; // 回调到函数外 *e = head->data; // 更改头节点 *Q->front->next = head->next; // 如果删到了队尾最后一个元素 if (*Q->rear == head) *Q->rear = *Q->front; // 删除临时指针指向的头节点 free(head); return OK; }
// 清空队列 Status ClearQueue(LinkQueue *Q) { if (*Q->front->next == NULL) return ERROR; QueueNodePtr temp, p; // 首元节点 *Q->rear = *Q->front; p = *Q->front->next; *Q->front->next = NULL; // 此时只有temp指向首元节点 while (p) { temp = p; p = p->next; free(temp); } return OK; }
// 销毁队列
Status DestoryQueue(LinkQueue *Q) {
if (*Q->front->next == NULL) return ERROR;
/*
说明,头节点也是个malloc开辟的,也需要释放
*/
while (*Q->front) {
*Q->rear = *Q->front->next;
free(*Q->front);
*Q->front = *Q->rear;
}
return OK;
}
Status GetHead(LinkQueue Q, ElemType *e) {
if (QueueEmpty(*Q)) return ERROR;
*e = Q.front->next->data;
return OK;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。