目录
sqStack.h
// 顺序栈
#ifndef __SQSTACK_H__
#define __SQSTACK_H__
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 20 // 数组最大长度
typedef int datatype; // 类型重定义
/// @brief 栈声明
typedef struct {
/// @brief 数据域
datatype data[MAXSIZE];
/// @brief 栈顶
int top;
} sqStack_t;
/// @brief 创建栈
/// @return 成功栈地址 失败NULL
sqStack_t* sqStack_create();
/// @brief 判断栈空
/// @param S 栈地址
/// @return 0非空 1空
int sqStack_empty(sqStack_t* S);
/// @brief 判断栈满
/// @param S 栈地址
/// @return 0未满 1满
int sqStack_full(sqStack_t* S);
/// @brief 入栈
/// @param S 栈地址
/// @param data 入栈数据
/// @return 成功0 失败-1
int sqStack_push(sqStack_t* S, datatype data);
/// @brief 出栈
/// @param S 栈地址
/// @return 成功0 失败-1
int sqStack_pop(sqStack_t* S);
/// @brief 打印栈
/// @param S 栈地址
/// @param flag 标识打印方向(0栈顶->栈底 1栈底->栈顶)
void print_sqStack(sqStack_t* S, int flag);
/// @brief 释放空间
/// @param S 栈地址
/// @return NULL
sqStack_t* sqStack_free(sqStack_t* S);
#endif
sqStack.c
#include "sqStack.h"
/// @brief 创建栈
/// @return 成功栈地址 失败NULL
sqStack_t* sqStack_create()
{
// 1.申请空间
sqStack_t* S = (sqStack_t*)malloc(sizeof(sqStack_t));
if (S == NULL) {
printf("malloc fail\n");
return NULL;
}
// 2.初始化成员
S->top = -1;
return S;
}
/// @brief 判断栈空
/// @param S 栈地址
/// @return 0非空 1空
int sqStack_empty(sqStack_t* S)
{
return S->top == -1 ? 1 : 0;
}
/// @brief 判断栈满
/// @param S 栈地址
/// @return 0未满 1满
int sqStack_full(sqStack_t* S)
{
return S->top == MAXSIZE - 1 ? 1 : 0;
}
/// @brief 入栈
/// @param S 栈地址
/// @param data 入栈数据
/// @return 成功0 失败-1
int sqStack_push(sqStack_t* S, datatype data)
{
// 1.校验栈地址
if (S == NULL) {
printf("sqStack is NULL\n");
return -1;
}
// 2.判断栈满
if (sqStack_full(S)) {
printf("sqStack is full\n");
return -1;
}
// 3.入栈
S->data[++S->top] = data;
return 0;
}
/// @brief 出栈
/// @param S 栈地址
/// @return 成功0 失败-1
int sqStack_pop(sqStack_t* S)
{
// 1.校验栈地址
if (S == NULL) {
printf("sqStack is NULL\n");
return -1;
}
// 2.判断栈空
if (sqStack_empty(S)) {
printf("sqStack is empty\n");
return -1;
}
// 3.出栈
printf("%d pop OK\n", S->data[S->top--]);
return 0;
}
/// @brief 打印栈
/// @param S 栈地址
/// @param flag 标识打印方向(0栈顶->栈底 1栈底->栈顶)
void print_sqStack(sqStack_t* S, int flag)
{
// 1.校验栈地址
if (S == NULL) {
printf("sqStack is NULL\n");
return;
}
// 2.判断栈空
if (sqStack_empty(S)) {
printf("sqStack is empty\n");
return;
}
// 3.遍历栈
int i = 0;
if (flag) { // 1栈底->栈顶
while (i <= S->top) {
printf("%d\t", S->data[i]);
i++;
}
} else { // 0栈顶->栈底
i = S->top;
while (i != -1) {
printf("%d\t", S->data[i]);
i--;
}
}
puts("");
}
sqStack_t* sqStack_free(sqStack_t* S)
{
if(S){
free(S);
}
return NULL;
}
main.c
#include "sqStack.h"
int test_fun();
void FeelTheBase(int i);
int main(int argc, const char* argv[])
{
// 进制转换
int flag;
printf("input 十进制:");
scanf("%d", &flag);
FeelTheBase(flag);
return 0;
}
int test_fun()
{
// 1.创建栈
sqStack_t* S = sqStack_create();
if (S == NULL) {
return -1;
}
int flag;
datatype value; // 临时变量
while (1) {
printf("**********************************菜单**********************************\n");
printf("1入栈\t2出栈\t3打印\t4释放空间\t0退出\n");
printf("************************************************************************\n");
printf("input options:");
scanf("%d", &flag);
switch (flag) {
case 1:
// 入栈
if (S == NULL) {
printf("sqStack is NULL\n");
break;
}
printf("input push count:");
scanf("%d", &flag);
for (int i = 0; i < flag; i++) {
printf("input %d value:", i);
scanf("%d", &value);
sqStack_push(S, value);
}
break;
case 2:
// 出栈
if (S == NULL) {
printf("sqStack is NULL\n");
break;
}
printf("input pop count:");
scanf("%d", &flag);
for (int i = 0; i < flag; i++) {
sqStack_pop(S);
}
break;
case 3:
// 打印栈
printf("input 打印方向(0栈顶->栈底 1栈底->栈顶):");
scanf("%d", &flag);
print_sqStack(S, flag);
break;
case 4:
// 释放空间
S = sqStack_free(S);
break;
case 0:
// 退出程序
return 0;
break;
default:
printf("请输入正确选项\n");
break;
}
getchar();
printf("按下回车键返回菜单!!!");
getchar();
}
}
void FeelTheBase(int i)
{
// 1.创建栈
sqStack_t* S = sqStack_create();
if (S == NULL) {
return;
}
int temp = 0;
while (i) {
temp = i % 2;
i = i / 2;
sqStack_push(S, temp);
}
print_sqStack(S, 0);
S = sqStack_free(S);
}