目录
进栈次序:a1,a2,a3,······,an; 出栈次序:an,an-1,······,a3,a2,a1 后进先出
栈(Stack)是一种特殊的线性表,它所有的插入和删除都限制在同一端进行。
栈中允许进行插入、删除操作的一端叫栈顶,另一端则叫做栈底。
当栈中没有元素时,称为空栈,此时top=base。
非空栈中的栈顶指针始终在栈顶元素的下一个位置。
//--------------------------栈的顺序存储表示-------------------------//
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
typedef struct{
SElemType *base; //栈底指针,在栈构造之前和销毁之后,base的值为NULL
SElemType *top; //栈顶元素,一开始指向栈底
int stacksize; //当前已分配的存储空间,已元素为单位
}SqStack;
1、栈的初始化
int InitStack(SqStack *S)
{
S->base = (SElemType *)malloc(sizeof(SElemType));
if(!S->base) //存储分配失败
return -1;
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return 0;
}
2、入栈
插入元素e为新的栈顶元素
int Push(SqStack *S, SElemType e)
{
if(S->top-S->base >= S->stacksize) //栈满,则分配存储空间
{
S->base = (SElemType *)realloc(S->base, (S->stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S->base)
return -1; //存储分配失败
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*(S->top) = e;
S->top++; //非空栈中的栈顶指针始终在栈顶元素的下一个位置,指向e元素的下一个位置
}
3、出栈
若栈不空,则删除S的栈顶元素,用e返回其值
int Pop(SqStack *S, SElemType *e)
{
if(S->top == S->base)
return -1;
S->top--; //非空栈中的栈顶指针始终在栈顶元素的下一个位置,top--,指向e元素
*e = *(S->top);
}
4、返回栈顶元素
int GetTop(SqStack *S, SElemType *e)
{
if(S->top == S->base)
return -1;
*e = *(S->top-1);
return 0;
}
5、十进制转换为n进制
#include<stdio.h>
#include<malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct{
int *base;
int *top;
int stacksize;
}SqStack;
int InitStack(SqStack *S) //初始化
{
S->base = (int *)malloc(sizeof(int));
if(!S->base)
return -1;
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return 0;
}
int Push(SqStack *S, int e) //入栈、插入元素e为新的栈顶元素
{
if(S->top-S->base >= S->stacksize) //栈满,则分配存储空间
{
S->base = (int *)realloc(S->base, (S->stacksize+STACKINCREMENT)*sizeof(int));
if(!S->base)
return -1; //存储分配失败
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*(S->top) = e;
S->top++;
}
int Pop(SqStack *S, int *e) //出栈、若栈不空,则删除S的栈顶元素,用e返回其值
{
if(S->top == S->base)
return -1;
S->top--;
*e = *(S->top);
}
int conversion(int number, int n) //十进制数number转化为n进制
{
SqStack S;
InitStack(&S); //初始化S
while(number)
{
Push(&S, number%n);
number = number/n;
}
int e;
while(S.top != S.base) //非空栈
{
Pop(&S, &e);
printf("%d", e);
}
return 0;
}
int main()
{
int number, n;
scanf("%d %d", &number, &n);
conversion(number, n);
}