实验2 栈的应用

实验2 栈的应用,第1张

实验2 栈的应用

1、建立能够存放十进制整数的顺序栈空栈,完成数制转换(十进制数转成二进制数、八进制数和十六进制数)。

#include 
#include 
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -1
#define ERROR -1
#define TRUE 1
#define FALSE 0

typedef struct{
    int *base;
    int *top;
    int stacksize;
} SqStack;

void InitStack(SqStack *S){ //初始化栈
    S->base = (int*)malloc( STACK_INIT_SIZE * sizeof(int) );
    if( !S->base )exit(OVERFLOW);
    S->stacksize = STACK_INIT_SIZE;
    S->top = S->base;
}

//插入元素 e 为栈顶元素
void Push(SqStack *S, int e){
    if(S->top - S->base >= S->stacksize){
        S->base = (int*)realloc(S->base, (S->stacksize + STACKINCREMENT)*sizeof(int));
        if( !S->base )exit(OVERFLOW);
        
        S->top = S->base + S->stacksize;
        S->stacksize += STACKINCREMENT;
    }
    *S->top++ = e;
}

//用 e 返回栈顶元素并删除之
void Pop(SqStack *S, int *e){
    if(S->top == S->base)exit(ERROR);
    *e = *--S->top;
}

//若S为空栈,返回TRUE, 否则返回FALSE
int StackEmpty(SqStack S){
    if(S.base == S.top){
        return TRUE;
    }
    else return FALSE;
}

//数制转换函数
void conversion(){
    int n, type, flag = 0;
    int e;
    SqStack S;
    InitStack(&S);
    printf("请输入一个十进制数:n");
    scanf("%d", &n);
    printf("请输入要转换成的进制类型(输入 2 或 8 或 16):n");
    scanf("%d", &type);
    if(n==0 && (type==2 || type==8 || type==16)){
        printf("转换后的 %d 进制数为:n0n", type);
        exit(0);
    }
    if(n<0){
        flag = 1;
        n = -n;
    }
    switch (type) {
        case 2:
            while(n){
                Push(&S, n % 2);
                n /= 2;
            }
            printf("转换后的 2 进制数为:n");
            if(flag)printf("-");
            while( !StackEmpty(S) ){
                Pop(&S, &e);
                printf("%d", e);
            }
            printf("n");
            break;
            
        case 8:
            while(n){
                Push(&S, n % 8);
                n /= 8;
            }
            printf("转换后的 8 进制数为:n");
            if(flag)printf("-");
            while( !StackEmpty(S) ){
                Pop(&S, &e);
                printf("%d", e);
            }
            printf("n");
            break;
            
        case 16:
            while(n){
                Push(&S, n % 16);
                n /= 16;
            }
            printf("转换后的 16 进制数为:n");
            if(flag)printf("-");
            while( !StackEmpty(S) ){
                Pop(&S, &e);
                printf("%d", e);
            }
            printf("n");
            break;
        default:
            printf("输入的类型有误,请检查后重新输入!n");
            break;
    }
}

int main() {
    conversion();
    return 0;
}

运行结果:


2、建立能够存放字符的顺序栈空栈,利用栈的特性对输入的字符串完成是否为回文的判断。

#include 
#include 
#include 
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -1
#define ERROR -1

typedef struct{
    char data[STACK_INIT_SIZE];
    int base;
    int top;
    int stacksize;
} SqStack;

//栈初始化
 void InitStack(SqStack *S){
     for(int i=0; idata[i]='';
     S->base = S->top = 0;
     S->stacksize = STACK_INIT_SIZE;
}

//插入元素 e 为栈顶元素
void Push(SqStack *S, char e){
    if(S->top == STACK_INIT_SIZE - 1)exit(ERROR);
    
    S->data[S->top++] = e;
}

//回文字符串判断
void isPalindrome(){
    int len = 0, flag = 1;
    SqStack S;
    printf("请输入字符串长度:n");
    scanf("%d", &len);
    printf("请输入字符串:n");
    getchar();
    while(len--){
        char temp;
        scanf("%c", &temp);
        Push(&S, temp);
    }

    for(int i=0; i 

运行结果:



实验心得:

1、typedef一个变量时,不能直接在声明的同时初始化。而应该是在申明一个此类型变量时或者之后进行初始化。也可以在typedef后面声明一个实变量,用这个实变量去给以后新的此类型变量赋值初始化。

2、顺序栈的“先入后出”特点,能够为许多问题提供有效的解决方案,如括号配对、后缀表达式计算等,这种数据结构的特点和用法应该熟练掌握。

3、当不确定输入变量的数量时,可以采用动态内存分配来解决变量输入不断增加的内存不够问题,入栈的Push函数有效地体现了这一点。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5634604.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-15
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存