SqStack進制計算

基於SqStack 進制計算函數

#include<malloc.h> 
#include<stdio.h> 
#include<stdlib.h> 
typedef int Status;
typedef int SElemType;
#define STACK_INIT_SIZE 100 
#define STACKINCREMENT 20
#define OVERFLOW -2
#define OK 1
#define ERROR 0
typedef struct SqStack
{
    SElemType *base;
    SElemType *top;
    int stacksize;
} SqStack; // 順序棧


Status InitStack(SqStack &S)
{ // 構造一個空棧S
    if (!(S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType))))
        exit(OVERFLOW); // 存儲分配失敗
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return OK;
}
int GetTop(SqStack S)
{ // 若棧不空,則用e返回S的棧頂元素
    if (S.top>S.base)
        return *(S.top - 1);
}

Status Push(SqStack &S, SElemType e)
{ // 插入元素e爲新的棧頂元素

    if (S.top - S.base >= S.stacksize) // 棧滿,追加存儲空間
    {

        S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
        if (!S.base)
            exit(OVERFLOW); // 存儲分配失敗
        S.top = S.base + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *S.top = e;
    S.top++;
    return OK;
}

Status Pop(SqStack &S, SElemType &e)
{ // 若棧不空,則刪除S的棧頂元素,用e返回其值,並返回OK;不然返回ERROR
    if (S.top == S.base)
        return ERROR;
    //e=*--S.top;//e=*S.top;
    S.top--;
    e = *S.top;
    return e;
}

Status StackTraverse(SqStack S, Status(*visit)(SElemType))
{ // 從棧底到棧頂依次對棧中每一個元素調用函數visit()。
  // 一旦visit()失敗,則操做失敗
    while (S.top>S.base)
        visit(*S.base++);
    printf("\n");
    return OK;
}
int main()
{
    SqStack S;
    int x, y, e,num1;
    InitStack(S);
    printf("輸入一個十進制數:\n");
    scanf("%d", &x);
    printf("輸入一個進制數:\n");
    scanf("%d", &num1);
    while (x)
    {
        Push(S, x % num1);
        x = x / num1;
    }
    while (S.base != S.top)
    {
        y = Pop(S, e);
        printf("%d", y);
    }
    printf("\n======================\n");

    system("pause");
    return 0;
}

參考:https://blog.csdn.net/sunshunli/article/details/78461172spa

相關文章
相關標籤/搜索