基于數(shù)據(jù)結(jié)構(gòu)(C語言)實(shí)現(xiàn)棧的基本操作和數(shù)值轉(zhuǎn)換應(yīng)用
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<limits.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status; //函數(shù)類型
typedef int Boolean;//布爾型 值為TRUE 或 FALSE
typedef int SElemType;//棧元素類型為整型 (數(shù)值轉(zhuǎn)換)
//typedef char SElemType;//棧元素類型為字符型 (括號匹配)
/*******************棧的基本操作**********************/
#define STACK_INIT_SIZE 10 //初始分配量
#define STACKINCREMENT 2 //增量
typedef struct SqStack
{
SElemType * base;//棧底指針
SElemType * top;//棧頂指針
int stacksize;//當(dāng)前存儲空間
}SqStack;
Status InitStack(SqStack *S)
{ /* 構(gòu)造一個(gè)空棧S */
? (*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
? if(!(*S).base)
? ? exit(OVERFLOW); /* 存儲分配失敗 */
? (*S).top=(*S).base;
? (*S).stacksize=STACK_INIT_SIZE;
? return OK;
}
Status ClearStack(SqStack *S)
{ /* 把S置為空棧 */
? (*S).top=(*S).base;
? return OK;
}
Status StackEmpty(SqStack S)
{ /* 若棧S為空棧,則返回TRUE,否則返回FALSE */
? if(S.top==S.base)
? ? return TRUE;
? else
? ? return FALSE;
}
int StackLength(SqStack S)
{ /* 返回S的元素個(gè)數(shù) */
? return S.top-S.base;
}
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;
? return OK;
}
Status Pop(SqStack *S,SElemType *e)
{ /* 若棧不空,則刪除S的棧頂元素,用e返回其值,并返回OK;否則返回ERROR */
? if((*S).top==(*S).base)
? ? return ERROR;
? *e=*--(*S).top;
? return OK;
}
void conversion()
{ /* 自定義數(shù)值轉(zhuǎn)換實(shí)現(xiàn)? */
? SqStack s;
? unsigned n; /* 非負(fù)整數(shù) */
? unsigned u;/* 目標(biāo)進(jìn)制 */
? SElemType e;
? InitStack(&s); /* 初始化棧 */
? printf("n(正整數(shù)) = ");
? scanf("%u",&n);
? printf("請輸入想要轉(zhuǎn)化的進(jìn)制(例如 2,8,16進(jìn)制)= ");
? scanf("%u",&u);
? while(n&&u) /* 當(dāng)n&&u不等于0 */
? {
? ? Push(&s,n%u); /* 入棧n除以u的余數(shù)(u進(jìn)制的低位) */
? ? n=n/u;
? }
? while(!StackEmpty(s)) /* 當(dāng)棧不空 */
? {
? ? Pop(&s,&e); /* 彈出棧頂元素且賦值給e */
? ? if(e<=9)
? ? ? printf("%d",e); /* 輸出e */
? ? else
? ? ? printf("%c",e+55);/* 化為16進(jìn)制e-9+64 */
? }
? printf("\n");
}
main()
{
conversion();
}
/*
如有不足,多多指教。
(? ??_??)?
*/