栈
栈是限制在一端进行插入和删除操作的线性表(俗称堆栈),允许进行操作的一端称为“栈顶”,另一固定端称为“栈底”,当栈中没有元素时称为“空栈”。特点:先进后出(LIFO)。
基本运算:
-
创建空栈:
CreateStack(len)
-
清空栈:
ClearStack(S)
-
判断是否栈空:
EmptyStack(S)
-
判断是否栈满:
FullStack(S)
-
元素进栈:
PushStack(S)
-
元素出栈:
PopStack(S)
-
取栈顶元素:
GetTop(S)
**顺序栈:**它是顺序表的一种,具有顺序表同样的存储结构,由数组定义,配合用数组下标表示的栈顶指针top(相对指针)完成各种操作。
typedef int data_t; //定义栈中数据元素的数据类型
typedef struct
{
data_t *data; //用指针指向栈的存储空间
int maxlen; //当前栈的最大元素个数
int top; //指示栈顶位置(数组下标)的变量
}seqstack_t; //顺序栈类型定义
创建栈
seqstack_t *CreateStack(int len)
{
seqstack_t *ss;
ss = (seqstack_t *)malloc(sizeof(seqstack_t));
ss->data = (data_t *)maloc(sizeof(data_t) *len)
ss->top = -1;
ss->maxlen = len;
return ss;
}
清空栈
ClearStack(seqstack_t *S)
{
S->top = -1
}
判断栈是否空
int EmptyStack(seqstack_t *S)
{
return (S->top == -1 ? 1:0);
}
进栈
void PushStack(seqstack_t *S, data_t x)
{
if(S->top == NULL){
printf("overflow!\n");
return;
}
else{
S->top++;
S->data[S->top] = x;
}
return ;
}
链式栈
插入操作和删除操作均在链表头部进行,链表未卜就是栈底,栈顶指针就是头指针。
typedef int data_t; //定义栈中数据元素的数据类型
typedef struct node_t
{
data_t data; //数据域
struct node_t *next; //链接指针域
}linkstack_t; //链栈类型定义
创建空栈
linkstack_t *CreateLinkstack()
{
linkstack_t *top;
top = (linkstack_t *)malloc(sizeof(linkstack_t));
top->next = NULL;
return top;
}
判断是否是空栈
int EmptyStack(linkstack_t *top)
{
return (top->next == NULL ? 1:0)
}
入栈
void PushStack(linkstack_t *top, data_t x)
{
linkstack_t *p; //定义辅助指针
p = (linkstack_t *)malloc(sizeof(linkstack_t)); //指向新结点
p->data = x; //将数据存入新结点的数据域中
p->next = top->next;
top->next = p; //新结点插入原栈顶之前
reurn;
}
队列概念及特征
队列概念:队列是限制在两端进行插入操作和删除操作的线性表,允许进行存入操作的一端称为“队尾”,允许进行删除操作的一端称为“队头”。当线性表中没有元素时,称为“空对”。
特点:先进先出(FIFO)
队列的特征:
-
数据:
对于非空的队列,表头没有直接前驱,表尾没有直接后继,其他有且仅有一个直接前驱和一个直接后继。
-
操作
只允许在表尾插入数据,在表头删除数据。
规定:
front:始终存放在表头前一个位置的下标
rear:始终存放队尾的下标
C语言中:
结构体——封装数据
函数——封装代码
队列的顺序存储
typedef int data_t; //定义队列中数据元素的数据类型
#define MAXSIZE 64 //定义队列的容量
typedef struct
{
data_t data[MAXSIZE]; //用数组作为队列的储存空间
int front, rear; //指示队头前一个位置和队尾位置的指针
}sequeue; //顺序队列类型定义
sequeue *sq; //定义指向顺序队列的指针
顺序队列基本算法分析
-
初始化
-
申请顺序队列的空间
-
初始化队头和队尾指针
front = rear = -1;
-
-
插入
-
删除
-
是否空
-
是否满
来源:https://blog.csdn.net/qq_39431829/article/details/99761561