数据结构学习记录连载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;
}