日期: 2018-9-11
一.今日任务:
学习数据结构中的树形结构和线性结构,线性结构存储方式分为:顺序存储(连续)、链式存储(不连续)。主要学习线性结构中的栈(先进后出,如图所示),分为:初始化栈、进栈、出栈、判断栈是否为空、获取栈顶元素、清空栈的相关函数编写。
二.今日任务完成情况
今日任务已按计划完成,上课代码全部正常运行,今日代码量:200。
三.今日开发中出现的问题汇总
对函数的传值和传址不够熟悉,对指针的移动不够熟练,还学要仔细思考、多加练习。
四.今日未解决问题
对结构体的使用通过指针访问结构体成员变量还不熟悉,需要多练。
五.今日开发收获
学会如何定义一个新的头文件,主要由三部分组成:
#ifndef STACK_H
#define STACK_H
// 相关语句块
#endif
1.当预处理时把头文件展开放到c文件下,第一条语句用于防止同一个c程序重复包含同一个头文件。
2.栈的操作流程如下:
栈的头文件定义
#ifndef STACK_H
#define STACK_H
#define MAXSIZE 10
#define SUCCESS 1000
#define FAILURE 1001
struct stack{
int data[MAXSIZE]; //数组
int top; //栈顶指针(数组下标)
};
typedef struct stack S; //重新定义
#endif
初始化栈
#include"stack.h"
#include<stdlib.h>
int InitStack(S *s)
{
if (NULL == s)//入参判断
{
return FAILURE;
}
s->top = -1;//空栈,栈顶指针为-1
return SUCCESS;
}
进栈
int push(S *s,int e)
{
if (NULL == s) //入参判断
{
return FAILURE;
}
if(s->top == MAXSIZE - 1) //栈满
{
return FAILURE;
}
s->data[s->top + 1] = e;
s->top++;
return SUCCESS;
}
出栈
int pop(S *s) //出栈
{
if (NULL == s) //入参判断
{
return FAILURE;
}
if (-1 ==s->top) //空栈
{
return FAILURE;
}
int e = s->data[s->top]; //记录栈顶元素
s->top--;
return e; //返回栈顶元素
}
判断栈是否为空
int EmptyStack(S s)
{
return (s.top == -1) ? SUCCESS : FAILURE;
}
获取栈顶元素
int GetTop(S s)
{
if (s.top == -1)
{
return FAILURE;
}
return s.data[s.top];
}
清空栈
int ClearStack(S *s)
{
if (NULL == s)
{
return FAILURE;
}
s->top = -1;
return SUCCESS;
}
主函数的调用
#include<stdio.h>
#include"stack.h"
int main()
{
S stack;//定义一个栈
int ret, i;
ret = InitStack(&stack);//初始化栈
if (SUCCESS == ret)
{
printf("Init Success!\n");
}
else
{
printf("Init Failure!\n");
}
for (i = 0; i < 10; i++)
{
ret = push(&stack, i + 1);
if (SUCCESS == ret)
{
printf("push %d success!\n",i + 1);
}
else
{
printf("push failure!\n");
}
}
for (i = 0; i < 3; i++)
{
ret = pop(&stack);
if(ret == FAILURE)
{
printf("pop failure!\n");
}
else
{
printf("pop %d success!\n",ret);
}
}
ret = EmptyStack(stack);
if (ret == SUCCESS)
{
printf("stack is empty!\n");
}
else
{
printf("stack is not empty!\n");
}
ret = GetTop(stack);
if (ret == FAILURE)
{
printf("Get Top Failure!\n");
}
else
{
printf("Top %d\n",ret);
}
ret = ClearStack(&stack);
if(ret == FAILURE)
{
printf("clear failure!\n");
}
else
{
printf("clear success!\n");
}
ret = EmptyStack(stack);
if (ret == SUCCESS)
{
printf("stack is empty!\n");
}
else
{
printf("stack is not empty!\n");
}
return 0;
}
运行结果
六.自我评价
只要多加练习一定可以孰能生巧。