数据结构学习记录连载7(堆栈提高要求)

说明:继续实现前面堆栈部分提高要求的功能

1.SeqStack.h

/*
* Copyright (c) 2009,FreshAir团队嵌入式软件研发组
* All rights reserved.
*
* 文件名称:SeqStack.h
* 摘 要: 顺序堆栈类的定义
*
* 当前版本:1.0
* 作 者: 吴友强
* 完成日期:2009年10月13日
*
* 取代版本:
* 原作者 :
* 完成日期:
*/
#include <iostream.h>
#include <stdlib.h>

typedef int DataType;
const int MaxStackSize = 100;
class SeqStack 
{
private:
 DataType data[MaxStackSize];
 int top;
public:
 SeqStack();
 virtual ~SeqStack();

 void Push(const DataType &item); //入栈
 DataType Pop(void);     //出栈
 DataType Peek(void) const;  //返回栈顶元素
 int StackIsEmpty(void) const;   //堆栈是否为空
 int GetStackSize(void) const; //返回堆栈的元素个数
 void ClearStack(void);   //清空堆栈
};

2.SeqStack.cpp

/*
* Copyright (c) 2009,FreshAir团队嵌入式软件研发组
* All rights reserved.
*
* 文件名称:SeqStack.cpp

* 摘 要: 顺序堆栈的实现
*
* 当前版本:1.0
* 作 者: 吴友强
* 完成日期:2009年10月17日
*
* 取代版本:
* 原作者 :
* 完成日期:
*/
#include "SeqStack.h"

SeqStack::SeqStack()
{
 top = 0;
}

SeqStack::~SeqStack()
{
}

/*
* 函数名称: Push

* 输 入: item
* item: 压入堆栈的数据
* 输 出:
* 功能描述: 将item入栈
* 作 者: 吴友强
* 日 期: 2009年10月17日
* 修 改:
* 日 期:
*/
void SeqStack::Push(const DataType &item)
{
 if (top == MaxStackSize)
 {
  cout << "堆栈已满!" << endl;
  exit(0);
 }

 data[top] = item;
 top++;
}

DataType SeqStack::Pop(void)
{
 if (top == 0)
 {
  cout << "堆栈以空!" << endl;
  exit(0);
 }

 top--;
 return data[top];
}

DataType SeqStack::Peek(void) const
{
 if (top == 0)
 {
  cout << "堆栈空!" << endl;
  exit(0);
 }

 return data[top-1];
}

int SeqStack::StackIsEmpty(void) const
{
 return top == 0 ? 1 : 0;
}

int SeqStack::GetStackSize(void) const
{
 return top;
}

void SeqStack::ClearStack(void)
{
 top = 0;
}

3.测试程序SeqStackTest.cpp(完成16进制与8进制的相互转换)

/*
* Copyright (c) 2009,FreshAir团队嵌入式软件研发组
* All rights reserved.
*
* 文件名称:SeqStackTest.cpp
* 摘 要: 测试顺序堆栈的功能
*
* 当前版本:1.0
* 作 者: 吴友强
* 完成日期:2009年10月17日
*
* 取代版本:
* 原作者 :
* 完成日期:
*/

#include "SeqStack.h"
//思路:先把16进制或8进制转化为10进制,在将10进制转化为8进制或16进制
//输入要求:要求输入的本来就是16进制或8进制,所以对应的输入要求以0x或0开头
//补充:当然可以直接以10进制的形式输入,只是算法不同而已
int main()
{
 SeqStack myStack;
 int jz, num, temp,result;
 result = 0;
 int i, j;
 cout << "请选择输入的是十六进制还是八进制(0,1):" ;
 cin >> jz;

 if (jz == 0)
 {
  cout << "请输入需要转换的16进制数字(以0x开头):";
  cin >> num;
  while (num)
  {
   temp = num % 16;
   myStack.Push(temp);
   num = num / 16;
  }
  for (i=myStack.GetStackSize()-1; i>=0; i--)
  {
   temp = myStack.Pop();
   for (j=0; j<i; j++)
   {
    temp *= 16;
   }
   result += temp;
  }

  num = result;
  result = 0;
  while (num)
  {
   temp = num % 8;
   myStack.Push(temp);
   num = num / 8;
  }
  for (i=myStack.GetStackSize()-1; i>=0; i--)
  {
   temp = myStack.Pop();
   for (j=0; j<i; j++)
   {
    temp *= 10;
   }
   result += temp;
  }

  cout << "result is: 0" << result << endl;
 }
 else if (jz == 1)
 {
  cout << "请输入需要转换的8进制数字(以0开头):";
  cin >> num;
  while (num)
  {
   temp = num % 8;
   myStack.Push(temp);
   num = num / 8;
  }
  myStack.Push(num);
  for (i=myStack.GetStackSize()-1; i>=0; i--)
  {
   temp = myStack.Pop();
   for (j=0; j<i; j++)
   {
    temp *= 8;
   }
   result += temp;
  }

  num = result; 
  while (num)
  {
   temp = num % 16;
   myStack.Push(temp);
   num = num / 16;
  }
  cout << "0x";
  while (!myStack.StackIsEmpty())
  {
   temp = myStack.Pop();
   switch (temp)
   {
   case 0:
   case 1:
   case 2:
   case 3:
   case 4:
   case 5:
   case 6:
   case 7:
   case 8:
   case 9:
    cout << temp;
    break;
   case 10:
    cout << "A";
    break;
   case 11:
    cout << "B";
    break;
   case 12:
    cout << "C";
    break;
   case 13:
    cout << "D";
    break;
   case 14:
    cout << "E";
    break;
   case 15:
    cout << "F";
    break;
   default:
    break;
   }
  }
  cout << endl;
 }
 else
 {
  cout << "输入出错,程序退出!" << endl;
  exit(0);
 }
 return 0;
}

posted @ 2009-10-19 19:49  蔷薇理想人生  阅读(198)  评论(0编辑  收藏  举报