堆栈和队列:
堆栈可以用来完成数据元素序列的特定转换,队列可以用作数据元素序列的缓冲存储。
顺序队列通常采用顺序循环队列方法实现,因为顺序循环队列可以避免顺序队列的“假溢出”问题。
堆栈:
堆栈只允许在固定一端进行插入和删除数据元素操作。
操作集合:
(1)初始化StackInitiate(S):初始化堆栈S。
(2)判断堆栈是否为空StackNotEmpty(S):若堆栈非空,则返回1;否则返回0。
(3)入栈StackPush(S, x):在堆栈S 的当前栈顶插入数据元素x。
(4)出栈StackPop(S, d):把堆栈S 的当前栈顶数据元素删除并由参数d 带回。若出栈成功,则返回1;否则返回0。
(5)取栈顶数据元素StackTop(S, d):取堆栈S 的当前栈顶数据元素并由参数d 带回。若取到数据元素,则返回1;否则返回0。
顺序堆栈的表示与实现:
typedef struct
{
DataType stack[MaxStackSize];
int top;
} SeqStack;
void StackInitiate(SeqStack *S) //初始化顺序堆栈S
{
S->top = 0; //初始化栈顶下标值
}
int StackNotEmpty(SeqStack S)
//判断顺序堆栈S 非空否,非空则返回1,否则返回0
{
if(S.top <= 0) return 0;
else return 1;
}
int StackPush(SeqStack *S, DataType x)
//把数据元素值x 存入顺序堆栈S 中,入栈成功则返回1,否则返回0
{
if(S->top >= MaxStackSize)
{
printf("堆栈已满无法插入! \n");
return 0;
}
else
{
S->stack[S->top] = x;
S->top ++;
return 1;
}
}
int StackPop(SeqStack *S, DataType *d)
//取出顺序堆栈S 的栈顶数据元素值由参数d 带回,出栈成功则返回1,否则返回0
{
if(S->top <= 0)
{
printf("堆栈已空无数据元素出栈! \n");
return 0;
}
else
{
S->top--;
*d = S->stack[S->top];
return 1;
}
}
int StackTop(SeqStack S, DataType *d)
//取顺序堆栈S 的当前栈顶数据元素值由参数d 带回,成功则返回1,否则返回0
{
if(S.top <= 0)
{
printf("堆栈已空! \n");
return 0;
}
else
{
*d = S.stack[S.top - 1];
return 1;
}
}
链式堆栈的表示与实现:
typedef struct snode
{
DataType data;
struct snode *next;
} LSNode;
void StackInitiate(LSNode **head)
//初始化带头结点链式堆栈
{
*head = (LSNode *)malloc(sizeof(LSNode));
(*head)->next = NULL;
}
int StackNotEmpty(LSNode *head)
//判断堆栈是否非空,非空,返回1;空,返回0
{
if(head->next == NULL) return 0;
else return 1;
}
void StackPush(LSNode *head, DataType x)
//把数据元素x 插入链式堆栈head 的栈顶作为新的栈顶
{
LSNode *p;
p = (LSNode *)malloc(sizeof(LSNode));
p->data = x;
p->next = head->next; //新结点链入栈顶
head->next = p; //新结点成为新的栈顶
}
int StackPop(LSNode *head, DataType *d)
//出栈并把栈顶元素由参数d 带回,出栈成功则返回1,否则返回0
{
LSNode *p = head->next;
if(p == NULL)
{
printf("堆栈已空出错!");
return 0;
}
head->next = p->next; //删除原栈顶结点
*d = p->data; //原栈顶结点元素赋予d
free(p); //释放原栈顶结点内存空间
return 1;
}
int StackTop(LSNode *head, DataType *d)
//取栈顶元素并把栈顶元素由参数d 带回
{
LSNode *p = head->next;
if(p == NULL)
{
printf("堆栈已空出错!");
return 0;
}
*d = p->data;
return 1;
}
void Destroy(LSNode *head)
{
LSNode *p, *p1;
p = head;
while(p != NULL)
{
p1 = p;
p = p->next;
free(p1);
}
}