版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
直接写代码吧
直接一些
#include<stdio.h>
#include<stdlib.h>
typedef int ElementType; /*队列元素类型*/
#define SUCCESS 0
#define FAILURE -1
/*定义队列结构*/
typedef struct StackInfo
{
ElementType value; /*队列存储的数据*/
struct StackInfo *next; /*指向队列的下一个元素*/
}StackInfo_st;
/*函数声明*/
StackInfo_st *createStack(void);
int stack_push(StackInfo_st *s,ElementType value);
int stack_pop(StackInfo_st *s,ElementType *value);
int stack_top(StackInfo_st *s,ElementType *value);
int stack_is_empty(StackInfo_st *s);
/*创建队列,外部释放内存*/
StackInfo_st *createStack(void)
{
StackInfo_st *stack = (StackInfo_st *)malloc(sizeof(StackInfo_st));
if(NULL == stack)
{
printf("malloc failed\n");
return NULL;
}
stack->next = NULL;
return stack;
}
/*入队列,0表示成,非0表示出错*/
int stack_push(StackInfo_st *s,ElementType value)
{
/*用来保存尾部指针*/
StackInfo_st *tail = s;
StackInfo_st *temp = (StackInfo_st *)malloc(sizeof(StackInfo_st));
if(NULL == temp)
{
printf("malloc failed\n");
return FAILURE;
}
/*找到链表的尾部*/
while(s->next != NULL)
{
s = s->next;
}
temp->value = value;
temp->next = s->next;
s->next = temp;
#if 0
/*将新的节点添加s->next前,使得s->next永远指向队列顶*/
temp->value = value;
temp->next = s->next;/*这一句是指向队列头部,实际上不用也没有问题*/
s->next = temp;
#endif
return SUCCESS;
}
/*出队列*/
int stack_pop(StackInfo_st *s,ElementType *value)
{
/*首先判断队列是否为空*/
if(stack_is_empty(s))
return FAILURE;
/*找出队列顶元素*/
*value = s->next->value;
/*保存等下需要free的指针*/
StackInfo_st *temp = s->next;
/*更换队列顶的位置*/
s->next = s->next->next;
/*释放队列顶节点内存*/
if(temp!=NULL)/*先判断指针是否为空*/
free(temp);
temp = NULL;
return SUCCESS;
}
/*访问队列顶元素*/
int stack_top(StackInfo_st *s,ElementType *value)
{
/*首先判断队列是否为空*/
if(stack_is_empty(s))
{
return FAILURE;
}
*value = s->next->value;
return SUCCESS;
}
/*判断队列是否为空,空返回1,未空返回0*/
int stack_is_empty(StackInfo_st *s)
{
/*队列顶指针为空,则队列为空*/
if(s->next == NULL)
{
printf("队列为空\n");
return true;
}
return false;
}
int main(void)
{
/*创建队列*/
StackInfo_st *stack = createStack();
printf("初始化队列头部\n");
/*如果队列为空,则压入元素1*/
if(stack_is_empty(stack))
{
int i = 0;
for(i = 0 ;i< 23;i++)
{
printf("向队列中放入第 [ %d ] 数据是 %d\n",i,i*3 + 7);
stack_push(stack,i*3 +7);
}
}
/*访问队列顶元素*/
int topVal;
stack_top(stack, &topVal);
printf("队列头部的数据是 %d\n",topVal);
/*出队列*/
int j = 0;
for(j = 0;j<25;j++)
{
int popVal = 0;
if(stack_pop(stack, &popVal) == SUCCESS)
{
printf("取出队列第 [ %d ]个的 数据 是 [ %d ]\n",j,popVal);
}
}
/*最后记得将队列内存都释放,可自己尝试实现*/
return 0;
}