数据结构——栈(附数制转换练习)

来源:互联网 发布:飞行器动力知乎 编辑:程序博客网 时间: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
原创粉丝点击