本文主要是介绍数据结构头歌:2-1顺序栈-课上练(带超全注释+源代码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、顺序栈定义
二、初始化一个空的顺序栈
三、判断顺序栈是否为空
四、判断顺序栈是否已满
五、压栈push:插入数据元素x
六、弹栈pop:删除元素
七、取栈顶元素
八、利用栈实现数进制转换
1.弹出元素->输出
2.将data转换成k进制
创建栈L:
转换成二进制:
转换成八进制:
转换成16进制:
1.定义:
2.除法(n ≠ 0) push
3.pop
#include <stdio.h>
#include<stdlib.h>
/*此处是顺序栈数据结构定义*/
typedef int DataType;
struct seqStack
{//有3个数据成员int MAXNUM;//用于记录顺序栈中能存放的最大元素个数的 整型 MAXNUM int top;//用于存放顺序栈的栈顶位置,初始化为0或-1 均可 整型 curNumDataType* element;//用于存放顺序栈数据元素的连续空间的起始地址
};
typedef struct seqStack* PseqStack;//第一关
PseqStack createNullStack_seq(int m)
{//此处填写代码,创建一个空的顺序栈,能存放的最大元素个数为 m,栈顶top设置为0//若m=0,则返回NULL PseqStack p = (PseqStack)malloc(sizeof(struct seqStack));//动态创建一个PseqStack类型的变量p,//不小于 sizeof(struct seqStack)字节 if (m != 0) //m:能存放的最大元素个数 {p->element = (DataType*)malloc(m * sizeof(DataType));//元素分配空间 if (p->element){p->top = 0; //下溢:空栈进行出栈 p->MAXNUM = m;//上溢: 已有m个元素进行进栈 return p; }else free(p);}return NULL;
}//第二关
int isNullStack_seq(PseqStack L)
{//判断顺序栈是否为空,若为空,返回值为1,否则返回值为0,若栈不存在,则返回-1if (L == NULL) return -1;else {if (L->top == 0) return 1;else return 0; }
}//第三关
int isFullStack_seq(PseqStack L)
{//判断顺序栈是否已满,若已满,返回值为1,否则返回值为0if (L->top >= L->MAXNUM)return 1;elsereturn 0;
}//第四关
int push_seq(PseqStack L, DataType x)
{//在顺序栈中插入数据元素x,若插入不成功,返回0;插入成功返回值为1if (L->top >= L->MAXNUM)return 0;else{L->top = L->top + 1; //栈顶=栈顶+1 L->element[L->top] = x; //给结构体 L中一个数组成员element[]的某一个L->top赋值return 1;}}//第五关
DataType pop_seq(PseqStack L)
{//弹栈并返回删除元素,若栈为空,则返回-1if (L->top == 0)return -1;else{int m = L->element[L->top];//定义栈顶元素m L->top = L->top - 1; //栈顶=栈顶-1 return m; //返回m }
}//第六关 取栈顶元素
DataType top_seq(PseqStack L)
{//取栈顶元素返回,若栈为空,则返回-1if (L->top == 0)return -1; //返回-1 elsereturn (L->element[L->top]);//返回栈顶元素
}
//销毁顺序栈,释放栈所占存储空间
int destroystack_seq(PseqStack L)
{//返回值为销毁的栈中现有数据元素的个数,若待销毁的线性表不存在,则返回0if (L != NULL){int num = L->top + 1;//定义num(销毁的栈中现有数据元素的个数0-top) L->MAXNUM = 0; //能存放的最大元素个数为0(待销毁的线性表不存在) free(L->element); //释放元素 ,销毁线性表 return num; //返回 }return 0;
}//第七关
//使用已实现的栈操作,实现数制转换
void print(PseqStack L)
{//逐个弹出栈L中的数据元素并输出,输出数据间不需要任何间隔符号while (L->top != 0){printf("%d", pop_seq(L));}
}void convert(int data, int k)
{//利用栈实现将data转换为k进制,k可能是2,8,16. 在本函数内实现转换并调用print函数输出转换后的结果//十六进制时输出 A ,B ,C, D,E,F 使用大写字母PseqStack L = createNullStack_seq(200);if (k == 2){int m = data % 2;push_seq(L, m);int n = data / 2;while (n != 0){m = n % 2;n = n / 2;push_seq(L, m);}print(L);}if (k == 8){int m = data % 8;push_seq(L, m);int n = data / 8;while (n != 0){m = n % 8;n = n / 8;push_seq(L, m);}print(L);}if (k == 16){int m = data % 16; char c;if (m >= 10){c = m - 10 + 'A';}push_seq(L, c);int n = data / 16;while (n != 0){m = n % 16;n = n / 16;if (m >= 10){c = m - 10 + 'A';}else{c = m + '0';}push_seq(L, c);}while (L->top != 0){printf("%c", pop_seq(L));}}
}
这篇关于数据结构头歌:2-1顺序栈-课上练(带超全注释+源代码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!