文章目录[隐藏]
用 C++ 和栈实现数制转换和进制转换
/*
用 C++ 和 栈 实现数制转换 和 进制转换
*/
#includemalloc.h //调用 malloc 和 realloc,不可或缺
#includeiostream //把这几个 换成 < >
#includestdlib.h //
#includestring.h //
using namespace std;
#define STACK_INIT_SIZE 100 //初始栈的大小
#define STACKINCREMENT 10 //栈的增量大小
typedef int SElemType;
//定义栈结构
typedef struct
{
SElemType *top;
SElemType *base;
int stacksize;
}SqStack;
//建立栈
void InitStack(SqStack &S) {
S.base = (SElemType *) malloc (STACK_INIT_SIZE * sizeof(SElemType)); // <=> S.base = (SElemType *) new int(STACK_INIT_SIZE * sizeof(SElemType));
if (!S.base)
{
cout << endl << 分配储存空间失败! << endl;//Allocate space failure!
}
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
}
//插入元素e
void 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)
cout << 追加存储空间失败! << endl;
S.top = S.base + S.stacksize; //重新初始化S.top的位置
S.stacksize += STACKINCREMENT; //栈长度加上增加的长度
}
*S.top++ = e; //cout << endl << 插入成功! << endl;
}
//打印栈,和书上的Pop功能类似但实现方法更简单
void PrintStack(SqStack &S)
{
SElemType *p;
for (p = S.top-1; p >=S.base; --p) //从栈顶向下打印元素
{
cout << *p;
}
}
//若栈不为空,则删除S的栈顶元素,用e返回其值,并返回0. 否则返回-1
void Pop(SqStack &S, SElemType &e, SElemType &m)
{
if (S.top == S.base)
m = -1;
e = * --S.top;
m = 0;
}
// 判断S是否为空栈
int StackEmpty(SqStack &S)
{
if (S.top == S.base)
return 1;
else
return 0;
}
//若栈不空,则用e返回S的栈顶元素,并返回1.否则返回0
void GetTop(SqStack &S, SElemType &e, SElemType &m)
{
if (S.top == S.base)
m = 0;
e = *(S.top -1);
m = 1;
}
//进制转换模块
void JIN()
{
SqStack S;
int N,NT,r,e,m;
cout << ***** 进制*转换 ***** << endl;
//建栈,并初始化 I
InitStack(S);
cout << 要转换的十进制数: ;
cin >> N;
cout << 要转换成的进制:;
cin >> r;
NT = N;
//取余数入栈
while (N)
{
Push(S, N % r);
N = N / r;
}
cout << NT << 的 << r << 进制数为: ;
/*
//打印栈
PrintStack(S);
这个方法比下面Pop更简单
*/
while (!StackEmpty(S))
{
Pop(S,e,m);
printf(%d,e);
}
cout << endl;
}
//回文数判断
void HUI()
{
cout << ***** 回文数判断 ****** << endl;
SqStack S;
char t[100];
InitStack(S);
int m,d,n,o,h,e,len;
cout << 请输入一段数字 << endl;
cin >> t;
len = strlen(t);
if (len % 2 == 0) //输入个数为偶数
{
for (m = 1 ; m < ( len / 2); m++)
{
Push(S, t[m]);
}
for (m ; m < len - 1; m++)
{
Pop(S,n,o);
if ( t[m] != n)
{
cout << 该数不是回文数! << endl;
exit(1);
}
}
m++;
if (m == len)//???????????
cout << 该数是回文数! << endl;
}
else //输入个数为奇数
{
for (m = 1; m < len / 2; m++)
{
Push(S, t[m]);
}
m++; //跳过中间项目
for (m ; m < len - 1; m++)
{
Pop(S,n,o);
if (t[m] != n)
{
cout << 该数不是回文数! << endl;
exit(1);
}
}
m++;
if( m == len )
cout << 该数是回文数! << endl;
}
}
int main()
{
int i = 0;
while( i != 3)
{
cout << ****** 菜单 ****** << endl;
cout << 1.进制转换\n 2.回文数判断\n 3.退出\n 请选择:;
cin >> i;
cout << ****************** << endl << endl;
if (i == 1)
JIN();
else if ( i == 2)
HUI();
cout << endl << endl;
}
return 0;
}