數(shù)據(jù)結(jié)構(gòu)~棧篇

基于數(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();

}

/*

如有不足,多多指教。

(? ??_??)?

*/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,142評論 0 2
  • /** * @author huihut * @E-mail:huihut@outlook.com * @vers...
    劉帆_d384閱讀 541評論 0 0
  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,246評論 0 38
  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 4,014評論 0 2
  • 年,是自己的年! 本寶寶是第一次經(jīng)歷從外地趕回家過年,好在今年放假異常的早,8號從杭州動車12小時(shí)回到重慶已經(jīng)是晚...
    紫宜閱讀 376評論 0 3

友情鏈接更多精彩內(nèi)容