栈和队列:
栈:后进先出
添加元素:压栈
删除元素:出栈
栈的实现:
1.顺序栈。
2.链式栈
栈最顶端的元素叫栈顶元素。
顺序栈:
头文件:
#ifndef _STACK_H_
#define _STACK_H_
#define SIZE 10
typedef enum {FALSE, TRUE} BOOL;
typedef int Data;
typedef struct stack
{
Data data[SIZE]; // 栈存储空间
int top; // 栈顶元素的下标
}Stack;
// 初始化栈
void Init(Stack *s);
// 判断空栈
BOOL Empty(Stack *s);
// 判断满栈
BOOL Full(Stack *s);
// 入栈
void Push(Stack *s, Data data);
// 出栈
void Pop(Stack *s);
// 获取栈顶元素
Data GetTop(Stack *s);
功能函数:
#include "stack.h"
#include <stdlib.h>
void Init(Stack *s)
{
if (NULL == s)
return;
s->top = -1;
}
BOOL Empty(Stack *s)
{
if (NULL == s)
return FALSE;
if (-1 == s->top)
return TRUE;
return FALSE;
}
BOOL Full(Stack *s)
{
if (NULL == s)
return FALSE;
if (SIZE-1 == s->top)
return TRUE;
return FALSE;
}
void Push(Stack *s, Data data)
{
if (NULL == s)
return;
if (Full(s) == TRUE)
return;
s->data[++s->top] = data;
}
void Pop(Stack *s)
{
if (NULL == s)
return;
if (Empty(s) == TRUE)
return;
s->top--;
}
Data GetTop(Stack *s)
{
if (NULL == s)
return;
if (Empty(s) == TRUE)
exit(-1); // 程序退出
return s->data[s->top];
}
主函数:
#include <stdio.h>
#include "stack.h"
int main()
{
Stack s;
Init(&s);
int i;
for (i = 0; i < 10; i++)
{
Push(&s, i);
}
while (!Empty(&s))
{
Data data = GetTop(&s);
printf ("%d\n", data);
Pop(&s);
}
printf ("栈结束\n");
return 0;
}
链式栈:
头文件:
#ifndef _STACK_H_
#define _STACK_H_
#define SIZE 10
typedef enum {FALSE, TRUE} BOOL;
typedef int Data;
typedef struct node
{
Data data;
struct node *next;
}Node;
typedef struct stack
{
Node *top;
}Stack;
// 初始化栈
void Init(Stack *s);
// 判断空栈
BOOL Empty(Stack *s);
// 入栈
void Push(Stack *s, Data data);
// 出栈
void Pop(Stack *s);
// 获取栈顶元素
Data GetTop(Stack *s);
#endif // _STACK_H_
功能函数:
#include "stack.h"
#include <stdlib.h>
void Init(Stack *s)
{
if (NULL == s)
return;
s->top = NULL;
}
BOOL Empty(Stack *s)
{
if (NULL == s)
return FALSE;
if (NULL == s->top)
return TRUE;
return FALSE;
}
void Push(Stack *s, Data data)
{
if (NULL == s)
return;
Node *node = (Node *)malloc(sizeof(Node)/sizeof(char));
if (NULL == node)
return;
node->data = data;
node->next = s->top;
s->top = node;
}
void Pop(Stack *s)
{
if (NULL == s)
return;
if (Empty(s) == TRUE)
return;
Node *tmp = s->top;
s->top = tmp->next;
free(tmp);
}
Data GetTop(Stack *s)
{
if (NULL == s)
return;
if (Empty(s) == TRUE)
exit(-1); // 程序退出
return s->top->data;
}
主函数:
#include <stdio.h>
#include "stack.h"
int main()
{
Stack s;
Init(&s);
int i;
for (i = 0; i < 10; i++)
{
Push(&s, i);
}
while (!Empty(&s))
{
Data data = GetTop(&s);
printf ("%d\n", data);
Pop(&s);
}
printf ("栈结束\n");
return 0;
}
队列:先进先出
有队头和队尾
顺序队列:
头文件:
#ifndef _QUEUE_H_
#define _QUEUE_H_
#define SIZE 20
typedef enum {FALSE, TRUE} BOOL;
typedef int Data;
typedef struct queue
{
Data data[SIZE];
int front; // 队头下标
int rear; // 队尾下标
}Queue;
// 初始化队列
void Init(Queue *s);
// 判断空队列
BOOL Empty(Queue *s);
// 判断满队列
BOOL Full(Queue *s);
// 入队列
void Push(Queue *s, Data data);
// 出队列
void Pop(Queue *s);
// 获取队头元素
Data GetTop(Queue *s);
功能函数:
#include "Queue.h"
#include <stdlib.h>
void Init(Queue *q)
{
if (NULL == q)
return;
q->front = 0;
q->rear = 0;
}
BOOL Empty(Queue *q)
{
if (NULL == q)
return FALSE;
if (q->rear == q->front)
return TRUE;
return FALSE;
}
BOOL Full(Queue *q)
{
if (NULL == q)
return FALSE;
if ((q->rear+1)%SIZE == q->front)
return TRUE;
return FALSE;
}
void Push(Queue *q, Data data)
{
if (NULL == q)
return;
if (Full(q) == TRUE)
return;
q->rear = (q->rear+1)%SIZE;
q->data[q->rear] = data;
}
void Pop(Queue *q)
{
if (NULL == q)
return;
if (Empty(q) == TRUE)
return;
q->front = (q->front+1)%SIZE;
}
Data GetTop(Queue *q)
{
if (NULL == q)
return;
if (Empty(q) == TRUE)
exit(-1); // 程序退出
return q->data[(q->front+1)%SIZE];
}
主函数:
#include <stdio.h>
#include "Queue.h"
int main()
{
Queue q;
Init(&q);
int i;
for (i = 0; i < 20; i++)
{
Push(&q, i);
}
while (!Empty(&q))
{
Data data = GetTop(&q);
printf ("%d\n", data);
Pop(&q);
}
return 0;
}
链式队列:
头文件:
#ifndef _QUEUE_H_
#define _QUEUE_H_
#define SIZE 10
typedef enum {FALSE, TRUE} BOOL;
typedef int Data;
typedef struct node
{
Data data;
struct node *next;
}Node;
typedef struct queue
{
Node *front; // 队头指针
Node *rear; // 队尾指针
}Queue;
// 初始化队列
void Init(Queue *s);
// 判断空队列
BOOL Empty(Queue *s);
// 入队列
void Push(Queue *s, Data data);
// 出队列
void Pop(Queue *s);
// 获取队头元素
Data GetTop(Queue *s);
#endif // _QUEUE_H_
功能函数:
#include "Queue.h"
#include <stdlib.h>
void Init(Queue *q)
{
if (NULL == q)
return;
q->front = NULL;
q->rear = NULL;
}
BOOL Empty(Queue *q)
{
if (NULL == q)
return FALSE;
if (NULL == q->front)
return TRUE;
return FALSE;
}
void Push(Queue *q, Data data)
{
if (NULL == q)
return;
Node *node = (Node *)malloc(sizeof(Node)/sizeof(char));
if (NULL == node)
return;
node->data = data;
node->next = NULL;
if (q->rear != NULL)
{
q->rear->next = node;
q->rear = node;
}
else
{
q->rear = node;
q->front = node;
}
}
void Pop(Queue *q)
{
if (NULL == q)
return;
if (Empty(q) == TRUE)
return;
Node *tmp = q->front;
q->front = tmp->next;
free(tmp);
if (q->front == NULL)
q->rear = NULL;
}
Data GetTop(Queue *q)
{
if (NULL == q)
return;
if (Empty(q) == TRUE)
exit(-1); // 程序退出
return q->front->data;
}
主函数:
#include <stdio.h>
#include "Queue.h"
int main()
{
Queue q;
Init(&q);
int i;
for (i = 0; i < 10; i++)
{
Push(&q, i);
}
while (!Empty(&q))
{
Data data = GetTop(&q);
printf ("%d\n", data);
Pop(&q);
}
return 0;
}