1.利用栈的基本操作
代码实现如下
#ifndef _SEQSTACK_H #define _SEQSTACK_H #include<iostream> #include<assert.h> using namespace std; typedef int ElemType; #define STACK_INIT_SIZE 20 typedef struct Stack { ElemType *base; int top; int capacity; }Stack; void ConverSeq(int n); bool IsFull(Stack *st); bool IsEmpty(Stack *st); void InitStack(Stack *st); bool Push(Stack *st,ElemType x); bool Pop(Stack *st,ElemType *v); bool Pop(Stack *st); #endif
bool IsFull(Stack *st) { return st->top >= st->capacity; } bool IsEmpty(Stack *st) { return st->top == 0; } void InitStack(Stack *st) { st->base = (ElemType *)malloc(sizeof(ElemType)*STACK_INIT_SIZE); assert(st->base != NULL); st->capacity = STACK_INIT_SIZE; st->top = 0; } void ConverSeq(int n) { Stack s; //定义一个栈 int x = 0; //x用于保存余数 InitStack(&s); while (n > 0) //辗转相除 { x = n % 8; Push(&s,x); n /= 8; } while (!IsEmpty(&s)) //输出 { Pop(&s,&x); cout << x; } } bool Push(Stack *st,ElemType x) { if (IsFull(st)) { cout << "栈已满," << x << "不能入栈!" << endl; return false; } st->base[st->top++] = x; return true; } bool Pop(Stack *st) { if (IsEmpty(st)) { cout << "栈以空,不能出栈!" << endl; return false; } st->top--; return true; } bool Pop(Stack *st,ElemType *v) { if (IsEmpty(st)) { cout << "栈以空,不能出栈!" << endl; return false; } *v = st->base[--st->top]; return true; }
2数组实现
void Conversion(int N) { int stack[STACKSIZE],top; top = 0; do { stack[top] = N % 8; top++; N /= 8; } while (N != 0); cout<<"转换后的八进制为:"; while (top > 0) { top--; cout<<stack[top]; } cout<<endl; }
3.链表实现
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h> typedef char ElemType; typedef struct node { ElemType data; struct node *next; }LStackNode,*LinkStack; void Conversion(int N);
void Conversion(int N) { LStackNode *p,*top = NULL; do { p = (LinkStack)malloc(sizeof(LStackNode)); p->data = N%8; p->next = top; top = p; N /= 8; }while(N != 0); cout<<"数制转换成八进制数:"; while(top != NULL) { p = top; cout<<p->data; top = top->next; free(p); } cout<<endl; }