#include<iostream>
using 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<i) {
e= Pop(S,e);
cout << e;
j++;
}
}
int main(void)
{
SqStack st;
SElemType e;
InitStack(st);
int c = 0;
while (c != 7)
{
cout << endl << "1. 入栈";
cout << endl << "2. 出栈";
cout << endl << "3. 读栈顶";
cout << endl << "4. 遍历栈";
cout << endl << "5. 清空顺序栈";
cout << endl << "6. 进制转换";
cout << endl << "7. 退出";
cout << endl << "选择功能(1~6):";
cin >> 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;
}
}
}
写了很多注释,方便我自己理解的,这其实是我数据结构课的实验报告