#includeusing namespace std; #define STACK_INIT_SIZE 100//存储空间初始分配量 #define STACKINCREMENT 10//存储空间分配增量 #define OVERFLOW -2 #define OK 1 #define ERROR -1 typedef int SElemType; typedef int Status; //顺序栈结构体定义 typedef struct { SElemType * base;//底指针 SElemType * top;//顶指针 int stacksize; }SqStack; //初始化栈 Status InitStack(SqStack &S) { S.base = new SElemType[STACK_INIT_SIZE];//动态分布一个空间 if (!S.base)exit(OVERFLOW);//exit退出函数 S.top = S.base;//顶指针与底指针相等,栈为空 S.stacksize = STACK_INIT_SIZE; return OK; } //将元素 e 入栈 Status Push(SqStack &S, SElemType e) { if (S.top - S.base >= S.stacksize)//栈满 S.base = new SElemType[STACK_INIT_SIZE + STACKINCREMENT]; //增加内存 if (!S.base)exit(OVERFLOW);//每次有新的内存申请都要判断 *S.top = e;//顶指针放入元素e S.top++;//顶指针移动到下一个 //*S.top ++= e;简单写法 return OK; } //出栈,用 e 返回出栈元素 Status Pop(SqStack &S, SElemType &e) { if (S.top == S.base)//判断栈是不是为空 return ERROR; e = *--S.top; return e; } //返回栈顶元素 Status GetTop(SqStack S, SElemType &e) { return (*--S.top); } //清空栈,变为空栈 void Clear(SqStack &S) { if(S.base) S.top = S.base; } //遍历栈元素 (从栈到栈顶) void Traverse(SqStack S) { while (S.top - S.base > 0) { cout << *S.base << " "; S.base++; } } Status StackEmpty(SqStack S)//若栈S为空栈,则返回OK 否则返回ERROR { if (S.top == S.base) return ERROR; else return OK; } //进制转换函数,将十进制数 dec 转化为 n 进制数,并输出转换后结果 void Convert(int dec, int n) { SqStack S; SElemType e; InitStack(S); int i = 0; while (dec!=0) { Push(S, dec%n); dec = dec / n; i++;//i是计数器,记录有几个元素入栈了 } int j = 0; while (j> c; switch (c) { case 1: { cout << "请输入要入栈的元素"; cin >> e; Push(st, e); break; } case 2: { e=Pop(st, e); cout <<"出栈元素是"<< e; break; } case 3: {cout << "栈顶元素是" << GetTop(st, e); break; } case 4: {Traverse(st); break; } case 5: {Clear(st); cout << "清空成功"; break; } case 6: { cout << "请输入一个十进制的数和要转换的进制"; int dec, n; cin >> dec >> n; Convert(dec, n); break; } case 7:break; } } }
写了很多注释,方便我自己理解的,这其实是我数据结构课的实验报告



