資料結構(C語言)棧的建立、入棧、出棧並進行進位制轉換
阿新 • • 發佈:2018-12-13
十進位制數轉換為八進位制:
| N |N div 8(商) | N mod 8(餘數)
|1348| 168 | 4
| 168 | 21 | 0
| 21 | 2 | 5
| 2 | 0 | 2
上述計算過程中是從低位到高位產生八進位制數的各個數位,而列印輸出應從高位到低位進行,因此若將計算過程中得到的八進位制數順序進棧,則按出棧順序列印輸出的即為最終的八進位制數。
top=base記為棧空的標記,每當插入新的元素,則將指標top+1,非空棧的棧頂元素始終在棧頂元素的下一個位置
#include<stdio.h> #include<stdlib.h> #define STACK_INIT_SIZE 100 #define STACKINCREATE 10 #define SElemType int typedef int Status; typedef struct { SElemType *base; SElemType *top;//棧頂指標 int stacksize;//已分配的儲存空間 }SqStack; Status InitStack(SqStack &s); Status ClearStack(SqStack &s); int StackLength(SqStack s); Status GetTop(SqStack s,SElemType &e); Status Push(SqStack &s, SElemType e); Status Pop(SqStack &s, SElemType &e); Status InitStack(SqStack &s)//初始化棧 { s.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));//分配地址,能夠容納100個元素 if (!s.base)exit(-2); s.top = s.base;//使棧頂等於棧底 s.stacksize = STACK_INIT_SIZE;//儲存空間 return 1; } Status GetTop(SqStack s,SElemType &e)//若棧不空,則用e返回s的棧頂元素,並返回OK { if (s.top == s.base)//棧為空 { return 0; } e = *(s.top - 1);//取得棧頂元素 } Status Push(SqStack &s, SElemType e)//插入元素e為新的棧頂元素 { if (s.top - s.base >= STACK_INIT_SIZE)//若棧滿則追加儲存空間 { s.base = (SElemType *)realloc(s.base, (s.stacksize + STACKINCREATE * sizeof(SElemType))); if (!s.base) { exit(-2); } s.top = s.base + s.stacksize;//s.base基地址更改,所以top指標要隨之更改 s.stacksize += STACKINCREATE; } *s.top++ = e;//先將e的值賦給棧頂指標,再加1 return 1; } Status Pop(SqStack &s,SElemType &e)//出棧 { if (s.top == s.base) return 0;//空棧 e = *--s.top;//由於棧頂指標始終指向棧頂元素的下一個位置,所以要先將棧頂指標減1,再賦值給e return 1; } int StackLength(SqStack s) { return s.top-s.base; } Status ClearStack(SqStack &s)//將棧制空 { s.base = s.top; return 1; } int main() { int N = 0; SqStack s; InitStack(s);//初始化棧 scanf_s("%d", &N); while (N) { Push(s, N % 8);//將元素入棧 N = N / 8; } SElemType e; while (StackLength(s)) { Pop(s, e);//出棧 printf("%d", e); } system("pause"); }