/* 栈操作 */
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <iostream>
#define N 10
#define LEN 10
using namespace std;
struct stack
{
int *base;
int *top;
int stacksize;
};
void InitStack(stack &s)
{//构造一个栈
s.base =(int *)malloc(LEN*sizeof(stack));
if(!s.base) {puts("创建失败");return;}
s.top = s.base;
s.stacksize = LEN;
puts("栈创建成功");
}
void DestroyStack(stack &s)
{//销毁栈
if(!s.base)
{
puts("栈不存在");
return;
}
free(s.base);
s.base = NULL;
puts("栈成功销毁");
}
bool StackEmpty(stack s)
{//判断栈是否为空
/* 以栈存在为前提 */
/* 为空返回“true” 否则返回“false”*/
if(s.base == s.top)
return 1;
return 0;
}
int StackLength(stack s)
{//获取栈的长度
/* 以栈存在为前提 */
return s.top - s.base;
}
int GetTop(stack s)
{//获取栈顶元素
if(StackEmpty(s))
{
puts("栈为空");
return 0;
}
return *(s.top-1);
}
void Push(stack &s , int e)
{//入栈操作
if(s.top - s.base > s.stacksize)
{
//溢出 追加空间
s.base = (int *) realloc(s.base , (s.stacksize+N)*sizeof(stack));
if(!s.base){return;}
//改变栈长属性 以及定位top指针的位置
s.top = s.base + s.stacksize;
s.stacksize+=N;
}
*s.top++=e;
}
int Pop(stack &s)
{//出栈操作
if(StackEmpty(s))
{
puts("栈为空"); return -1;
}
return *(--s.top);
}
void Conversion(int R)
{//实现进制转换 参数R为进制的基数
stack s1;
InitStack(s1);
int n , m;
printf("请输入一个整数: ");
scanf("%d",&n);
m=n;
while(n)
{
Push(s1,n%R);
n/=R;
}
printf("%d的%d进制表示为: ",m,R);
while(!StackEmpty(s1))
{
printf("%d",Pop(s1));
}
puts("");
DestroyStack(s1);
}
int main ()
{
stack s;
InitStack(s);
Push(s , 1);
Push(s , 2);
cout<<* (--s.top)<<endl;
//Pop(s);
cout<<*(--s.top)<<endl;
Conversion(2);
DestroyStack(s);
return 0;
}