順序棧的幾個基本操作 壓棧 彈出 數制轉換 等等
// 順序棧.cpp: 定義控制檯應用程式的入口點。 //
#include "stdafx.h" #include"stdlib.h" #define STACK_INIT_SIZE 100 #define STACKINCREAMENT 10 typedef int elem;
typedef struct { elem *base; elem *top; int stacksize; }SqStack;
SqStack s; void InitStack(SqStack * S) { S->base = (elem *)malloc(STACK_INIT_SIZE * sizeof(elem));//建立一個連續的 長度為100個整形的棧 S->stacksize = STACK_INIT_SIZE;
S->top = S->base;//棧剛開始為空 棧頂指標和棧底指標指向一樣
}
void Push(SqStack *S,elem e) { if (S->top - S->base >= S->stacksize) {//如果長度超出100 重新開闢十個長度連在後面 S->base = (elem *)realloc(S->base, (S->stacksize + STACKINCREAMENT) * sizeof(elem)); if (!S->base) exit(-2); printf("STACK---PUSH---SUCCESS\n\n"); S->top = S->base + S->stacksize; S->stacksize += STACKINCREAMENT; } *(S->top)=e;//將你想賦的值賦進去 S->top = S->top++;//棧頂指標往後推一個 }
void Pop(SqStack *S,elem *e) { if (S->top == S->base) { printf("棧目前為空\n"); exit(0); }
S->top--;//棧頂指標回退一個 *e = *S->top;//將棧的最後一個值提出來 }
int StackEmpty(SqStack *S) { if (S->top - S->base == 0) { printf("棧為空"); return 0; } return 1; }
elem StackLength(SqStack *S) { return S->top - S->base; }
void Numerical_conversion(int num,int Decimal) {//數值轉換 if (num < 0) { printf("-"); num = -num; }//如果數值是負的 先輸出一個- while (num!=0) { Push(&s,num%Decimal); num /= Decimal; }//將餘數壓棧 int stackLength = StackLength(&s);
for (int i = 0; i < stackLength; i++) { int num; Pop(&s, &num); printf("%d", num); }//將棧中的數依次彈出 printf("\n"); }
int main() { InitStack(&s); Numerical_conversion(10, 2); /*for (int i = 1; i < 101; i++) { Push(&s, i); } Push(&s, 1);*/ /*printf("%d\n", StackLength(&s)); int num; Pop(&s, &num); printf("%d\n",num);*/ return 0; }