C的数据结构,栈转化10进制总是报空,代码不知道哪里出错啦,麻烦各位办一下忙
#include
using namespace std;
//顺序栈结构体类型定义
typedef int SElemType;
const int STACK_INIT_SIZE = 100;
typedef struct {
SElemType* base;
SElemType* top;
int stacksize;
}sqstack;
//初始化顺序栈
void init_stack(sqstack& s) {
s.base = new SElemType[STACK_INIT_SIZE];
if (!s.base)
exit(-1);
s.top = s.base;
s.stacksize = STACK_INIT_SIZE;
}
//判断栈满
int stack_full(sqstack s) {
if (s.top - s.base >= s.stacksize)
return 1;
else
return 0;
}
//判断栈空
int stack_empty(sqstack s) {
if (s.base = s.top)
return 1;
else
return 0;
}
//入栈
void push_satck_sq(sqstack& s, SElemType x) {
if (stack_full(s))
cout << "The stack is full !" << endl;
else *s.top++ = x;
}
//出栈
int pop_stack_sq(sqstack& s, SElemType& x) {
if (stack_empty(s))
{
cout << "The satck is empty !" << endl;
return 0;
}
else
x = *(--s.top);
return x;
}
//获得栈顶元素
SElemType gettop_sq(sqstack s) {
if (stack_empty(s))
cout << "The stack is empty !";
else
return *(s.top - 1);
}
//输出栈中元素
void printstack_sq(sqstack s) {
sqstack p = s;
if (stack_empty(p))
cout << "The stack is empty !" << endl;
else
{
while (!stack_empty(p))
{
cout << gettop_sq(p) << " ";
p.top--;
}
}
}
void main(){
sqstack s;
init_stack(s);
int a, b;
cout << "请输入你要转换的十进制数" << endl;
cin >> a;
if (a != 0)
{
cout << "请输入你要转换的进制(最多支持16进制)" << endl;
cin >> b;
while (b > 16 || b < 0)
{
cout << "请输入正确的进制数(请输入你要转换的进制(最多支持16进制))" << endl;
cin >> b;
}
while (a != 0)
{
push_satck_sq(s, a % b);
a = a / b;
}
printstack_sq(s);
}
else cout << "输出完成" << endl;
}
运行正常
你的误区在于你这里定义的数据结构sqstack根本不是一个栈,你想一下,栈是一个能放进去多个元素的结构,那么你这里用什么来放元素呢。你这里定义的sqstack到底是什么,你这个结构体说白了就是三个int变量,而不是一个能存储多个数据的结构,无法表示成一个栈。另外你这里使用分配空间时使用数组,那么你要知道top和base就是栈的下标,而不是元素。你需要在这里面放一个数组来存储元素,而栈只是改变这些元素的位置关系而已。
象这样,把下标0作为栈底,定义top栈顶,然后data是存放数据的空间。
struct //定义栈的结构体
{
int data[MAXSIZE];
int top;
}Stack
下面代码使用纯c,仅供参考
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct //定义栈的结构体
{
int data[MAXSIZE];
int top;
}Stack, *pStack;
//栈的初始化
void s_init(pStack& S)
{
S = (pStack)malloc(sizeof(Stack));
if (S)
S->top = -1;
}
//入栈函数
void s_push(pStack& S, int x)
{
S->top++;
S->data[S->top] = x;
}
//出栈函数
void s_pop(pStack& S)
{
while (S->top != -1)
{
printf("%d", S->data[S->top]);
S->top--;
}
}
//进制转换函数
void zhuanhua(int m, int n, pStack& S)
{
/*进制转换基本原理
一直整除直至结果为0
将余数push到栈中*/
int k=0;
while (m != 0)
{
k = m % n;
s_push(S, k);
m = m / n;
}
}
//栈销毁函数
void s_delete(pStack& S)
{
if (S)
free(S);
S = NULL;
}
int main()
{
//初始化栈
pStack S;
s_init(S);
//输入十进制数
int a, b;
printf("请输入你要转换的十进制数:");
scanf("%d", &a);
//如果输入的数是0,则输出提示退出
if (a == 0)
{
printf("0就是0,无需转换\n");
exit(0);
}
//否则
else
{
//使用goto语句,如果输入的进制数不是1-16进制则重复执行
shurujinzhi:
printf("请输入你要转换的进制(最多支持16进制):");
scanf("%d", &b);
while (b > 16 || b < 0)
{
printf("请输入正确的进制数(请输入你要转换的进制(最多支持16进制)):");
goto shurujinzhi;
}
//进行转换,将转换完的结果保存到S
zhuanhua(a, b, S);
//出栈
s_pop(S);
//销毁栈
s_delete(S);
}
return 0;
}