数据结构——栈(附数制转换练习)
来源:互联网 发布:飞行器动力知乎 编辑:程序博客网 时间:2024/05/27 06:51
栈的ADT:
ADT Stack is Operations Stack createEmptyStack(void) 创建一个空栈 int isEmpty (Stack st) 判断栈是否为空栈 void push (Stack st, DataType x) 往栈中插入一个元素 void pop (Stack st) 从栈中删除一个元素 DataType top (Stack st) 求栈顶元素的值End ADT Stack
写栈的头文件SeqStack.h如下:
其中包括创建栈的结构体和栈操作函数的声明
#ifndef SEQSTACK_H#define SEQSTACK_Hstruct SeqStack{ int MAXNUM; // 栈中最大元素个数 int t; // 栈顶位置 int *s; // 栈中元素的起始位置};typedef struct SeqStack *PSeqStack; // 定义顺序栈类型PSeqStack creatEmptyStack_seq(int m); // 创建空顺序表int isEmptyStack_seq(PSeqStack pastack); // 判断一个栈是否为空void push_seq(PSeqStack pastack, int x); // 进栈void pop_seq(PSeqStack pastack); // 删除栈顶元素int pop_seq_return(PSeqStack pastack); // 删除栈顶元素,同时返回栈顶元素int top_seq(PSeqStack pastack); // 当pastack所指的栈不为空栈时,求栈顶元素的值#endif
然后写相关函数的c文件。 Stack.c
其中包括对栈处理的一些函数。详见头文件声明注释
#include <stdio.h>#include <stdlib.h>#include "SeqStack.h"#define TRUE 1#define FALSE 0// 创建空顺序栈PSeqStack creatEmptyStack_seq(int m){ PSeqStack pastack = (PSeqStack)malloc(sizeof(struct SeqStack)); if (pastack != NULL) { pastack->s = (int*)malloc(sizeof(int)*m); if (pastack->s) { pastack->MAXNUM = m; pastack->t = -1; return(pastack); } else { free(pastack); return NULL; } } else { printf("out of space.\n"); }}// 判断一个栈是否为空int isEmptyStack_seq(PSeqStack pastack){ return (pastack->t == -1);}// 进栈void push_seq(PSeqStack pastack, int x){ if (pastack->t >= (pastack->MAXNUM-1)) // 检查是否栈满 { printf("overflow! \n"); } else { // 若不满,先修改栈顶变量 pastack->t++; // 把元素x放到栈顶变量的位置中 pastack->s[pastack->t] = x; }}// 删除栈顶元素void pop_seq(PSeqStack pastack){ if (isEmptyStack_seq(pastack)) { printf("Underflow! \n"); } else { pastack->t = pastack->t-1; }}// 删除栈顶元素,同时返回栈顶元素int pop_seq_return(PSeqStack pastack){ int temp; if (isEmptyStack_seq(pastack)) { printf("Underflow!\n"); } else { temp = pastack->s[pastack->t]; pastack->t--; } return temp;}// 当pastack所指的栈不为空栈时,求栈顶元素的值int top_seq(PSeqStack pastack){ if (isEmptyStack_seq(pastack)) { printf("It is empty"); return 0; } else { return (pastack->s[pastack->t]); }}void print(PSeqStack pastack){ int temp, i; if (isEmptyStack_seq(pastack)) { printf("It is empty.\n"); } printf("现在栈内元素为:"); for(i=0; i<=pastack->t; i++) { printf("%d ", pastack->s[i]); } printf("\n");}
最后打印栈内元素没有使用弹出输出的方式,而采用了读取输出的方式,这样执行输出操作后,不会影响栈本身存储的内容。
最后是主函数:
#include <stdio.h>#include <stdlib.h>#include "SeqStack.h"#define TRUE 1#define FALSE 0void main(){ // 创建一个空栈 PSeqStack p = creatEmptyStack_seq(10); int data, n; int temp; char ch; // 对空栈赋值 printf("请输入元素(回车结束):"); do { scanf("%d", &data); push_seq(p ,data); ch = getchar(); } while (ch != '\n'); // 判断栈是否为空 printf("\n判断栈是否为空(返回1为空):"); printf("%d\n", isEmptyStack_seq(p)); // 打印输出 print(p); // 进栈 printf("\n向栈中添加一个元素:\n"); temp = 5; printf("添加的元素为:%d\n", temp); push_seq(p, temp); print(p); // 出栈 printf("\n弹出栈中一个元素:\n"); temp = pop_seq_return(p); printf("OK, 弹出的元素为:%d\n", temp); print(p); system("pause"); return 0;}
附带数制转换练习,十进制转二进制/八进制/十六进制
运行时自行导入SeqStack.h 和 Stack.c 文件,否则无法运行
数制转换代码:
#include <stdio.h>#include <stdlib.h>#include "SeqStack.h"// 实现八进制转换void OctConversion(PSeqStack ps, int n){ int temp; while(n) { push_seq(ps, n%8); n /= 8; } printf("转换为八进制后的结果:\n"); while(!isEmptyStack_seq(ps)) { temp = top_seq(ps); printf("%d", temp); pop_seq(ps); } printf("\n");}// 二进制的转换void BinConversion(PSeqStack ps, int n){ int temp; while(n) { push_seq(ps, n%2); n /= 2; } printf("转换为二进制后的结果:\n"); while(!isEmptyStack_seq(ps)) { temp = top_seq(ps); printf("%d", temp); pop_seq(ps); } printf("\n");}// 十六进制转换void HexConversion(PSeqStack ps, int n){ while(n) { int tmp = n%16; switch (tmp) { case 10:tmp = 'A'; break; case 11:tmp = 'B'; break; case 12:tmp = 'C'; break; case 13:tmp = 'D'; break; case 14:tmp = 'E'; break; case 15:tmp = 'F'; break; } push_seq(ps, tmp); n = n/16; } printf("转换为十六进制后的结果:\n"); while(!isEmptyStack_seq(ps)) { n = top_seq(ps); if (n<10) { printf("%d", n); } else { printf("%c", n); } pop_seq(ps); } printf("\n");}int main(){ PSeqStack p; int ten, MAXNUM; printf("请输入栈的最大容量MAXNUM:"); scanf("%d", &MAXNUM); p = creatEmptyStack_seq(MAXNUM); printf("请输入要转换的十进制数:"); scanf("%d", &ten); OctConversion(p, ten); BinConversion(p, ten); HexConversion(p, ten); system("pause"); return 0;}
涨姿势一下:二进制 Bin 八进制 Oct 十六进制 Hex
0 0
- 数据结构——栈(附数制转换练习)
- 数据结构实践——数制转换(栈)
- 数据结构—栈应用(一)数制转换
- 第六周数据结构实践——数制转换(栈)【项目4 - 数制转换】
- 数据结构实验五——栈实现数制转换
- 数据结构实践——数制转换
- 《数据结构(严蔚敏版)》学习笔记(三)——栈实现数制转换
- 数据结构题典020:栈的应用——数制转换(ANSI C)
- 栈——数制转换
- 栈—实现数制转换
- 数制转换(栈)
- 数据结构(严蔚敏)顺序栈_数制转换
- 【数据结构】栈的应用--数制转换(c++)
- 2015年大二上-数据结构-栈(4)- 数制转换
- 数据结构(七) 顺序栈实现数制转换
- 第6周SHH数据结构—【项目4-数制转换】
- [ 数据结构 ] DS线性表综合练习--数制转换
- 第六周项目四数据结构实践——数制转换(栈)
- 1004. Bracket Matching
- Backtracking questions
- 详解数据在内存中的真实存放次序:位序、字节序、大/小端模式与结构体、位域
- 动态规划算法求解最大公共字符串
- 40.Implement Queue by Two Stacks-用栈实现队列(中等题)
- 数据结构——栈(附数制转换练习)
- 《落花生》优秀教学设计 《落花生》优秀教学设计内容分析
- 微信小程序手机归属地查询功能实现
- 30分钟学会用scikit-learn的基本回归方法(线性、决策树、SVM、KNN)和集成方法(随机森林,Adaboost和GBRT)
- MIT6.824 分布式系统 lab1
- 快速排序算法
- JavaScript 学习笔记 1
- 决策树(ID3)python
- Leetcode 43. Multiply Strings