1. 程式人生 > >資料結構(C語言)棧的建立、入棧、出棧並進行進位制轉換

資料結構(C語言)棧的建立、入棧、出棧並進行進位制轉換

十進位制數轉換為八進位制:
| 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");
}

在這裡插入圖片描述