數據結構學習記錄連載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;
}
浙公網安備 33010602011771號