数据结构:栈 关键代码解读

#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;
}

结果展示
运行截图

发布了30 篇原创文章 · 获赞 2 · 访问量 779

猜你喜欢

转载自blog.csdn.net/cascara/article/details/103097938