#define ERROR 0
#define OK 1
typedef int status;
#define INITSIZE 1
#define INCREMENT 1
typedef int elemType;
typedef struct stack {
elemType* top;//指向栈顶,下一个插入元素的位置,判空条件:top==base
elemType* base;//指向栈底,若未分配空间,为NULL,判定栈存在条件
int stacksize;//记录目前分配的栈的大小,分配内存
}sqStack;//顺序存储结构的栈
status initStack(sqStack& s)//初始化
{
s.base = (elemType*)malloc(sizeof(elemType) * INITSIZE);//给栈分配初始内存
if (s.base == NULL)//分配失败
return ERROR;
s.top = s.base;//栈顶指向栈底位置
s.stacksize = INITSIZE;//更新分配大小
return OK;
}
status Push(sqStack& s,elemType e)//从栈顶加入元素e
{
if (s.base == NULL)//栈不存在
{
return ERROR;
}
if (s.top - s.base >= s.stacksize - 1)//栈满
{
elemType* newbase;
newbase = (elemType*)realloc(s.base, sizeof(elemType) * (s.stacksize + INCREMENT));//重新分配空间,且将原栈空间中的内容保留
if (newbase == NULL)//分配失败
return ERROR;
s.top = newbase + (s.top - s.base);//栈顶指向新分配空间所对应的栈顶
s.base = newbase;//栈底为新栈底
s.stacksize += INCREMENT;//更新分配空间大小
}
*s.top++ = e;//将新元素加入,且栈顶指针向上移位
return OK;
}
status Pop(sqStack& s, elemType& e)//取出栈顶元素
{
if (s.base==NULL)//栈不存在
{
return ERROR;
}
if (s.base == s.top)//栈空
return ERROR;
e = *--s.top;//取出元素,且栈顶指针向下移位
return OK;
}
应用
转换数制
int main(void)
{
sqStack s1;
elemType e;
int n, t;
initStack(s1);
while (Input(n, t))
{
while (n / t)
{
Push(s1, n % t);
n = n / t;
}
Push(s1, n);
while (Pop(s1, e))
cout << e;
cout << endl;
}
return 0;
}
int Input(int& n, int& t)
{
char s[100];
cout << "go on?(q to quit)" << endl;
cin >> s;
if (*s == 'q')
return 0;
cout << "which number to transfer:";
cin >> n;
cout << "in which form?";
cin >> t;
return 1;
}
结果展示