头文件
Stack.h
#pragma once
#include<stdexcept>
template<typename T,int MAXSIZE>
class Stack
{
private:
T elems[MAXSIZE];
int numElems = 0;
public:
Stack() = default;
void push(T const&);
void pop();
T top() const;
int size() const { return numElems; }
bool empty() const { return numElems == 0; }
bool full() const { return numElems == MAXSIZE; }
};
template <typename T, int MAXSIZE>
void Stack<T, MAXSIZE>::push(T const& elem)
{
if (numElems == MAXSIZE)
throw std::out_of_range("Stack<>::push(): Stack is full");
elems[numElems] = elem;
numElems++;
}
template <typename T, int MAXSIZE>
void Stack<T, MAXSIZE>::pop()
{
if (numElems <= 0)
throw std::out_of_range("Stack::pop(): Stack is empty");
--numElems;
}
template <typename T, int MAXSIZE>
T Stack<T, MAXSIZE>::top() const
{
if (numElems == 0)
throw std::out_of_range("Stack::top(): Stack is empty");
return elems[numElems - 1];
}
主程序文件
#include <iostream>
#include <memory>
#include <cctype>
#include <string>
#include "Stack.h"
using namespace std;
shared_ptr<Stack<int, 10>> p;
void scaleTransform(int scale, int objectScale, int n);
double toDecimal(const char* s, int scale);
void showMain()
{
cout << "1.初始化栈" << endl
<< "2.销毁栈" << endl
<< "3.清空栈" << endl
<< "4.栈判空" << endl
<< "5.求栈长度" << endl
<< "6.获取栈顶元素" << endl
<< "7.插入一个元素" << endl
<< "8.删除一个元素" << endl
<< "9.输出所有元素" << endl
<< "10.进制转换" << endl
<< "11.退出" << endl;
}
int main()
{
showMain();
int opt = 0;
while (true)
{
cout << "请输入你的选择:" << endl;
cin >> opt;
switch (opt)
{
case 1:
{
if (!p) p = make_shared<Stack<int, 10>>();
else cout << "栈已经初始化过了。" << endl;
break;
}
case 2:
{
if (!p) cout << "还未初始化栈" << endl;
else
{
p.reset();
cout << "栈销毁成功!" << endl;
}
break;
}case 3:
{
if (!p) cout << "还未初始化栈" << endl;
else
{
while (!p->empty())
p->pop();
cout << "栈清空成功!" << endl;
}
break;
}case 4:
{
if (!p) cout << "还未初始化栈" << endl;
else
{
if (p->empty())
cout << "栈是空的。" << endl;
else
cout << "栈不是空的" << endl;
}
break;
}case 5:
{
if (!p) cout << "还未初始化栈" << endl;
else
cout << "栈的长度是" << p->size() << endl;
break;
}case 6:
{
if (!p) cout << "还未初始化栈" << endl;
else
try
{
cout << "栈顶元素是" << p->top() << endl;
}
catch (exception const& e)
{
cout << e.what();
}
break;
}case 7:
{
if (!p) cout << "还未初始化栈" << endl;
else
{
cout << "请输入要插入的元素" << endl;
int n = 0;
cin >> n;
p->push(n);
}
break;
}case 8:
{
if (!p) cout << "还未初始化栈" << endl;
else
try
{
p->pop();
cout << "删除成功" << endl;
}
catch (exception const& e)
{
cout << e.what();
}
break;
}case 9:
{
if (!p) cout << "还未初始化栈" << endl;
else
while (!p->empty())
{
cout << p->top() << " ";
p->pop();
}
break;
}
case 10:
{
int scale;
int objectScale;
int n;
cout << "请输入原进制:";
cin >> scale;
cout << "请输入目标进制:";
cin >> objectScale;
cout << "请输入要转换的数字:";
if (scale == 10)
{
cin >> n;
scaleTransform(scale, objectScale, n);
}
else
{
string s;
cin.get();
getline(cin, s);
scaleTransform(10, objectScale, static_cast<int>(toDecimal(s.c_str(),scale)));
}
break;
}
case 11:exit(0);
default: cout << "请输入1-10之间的数。";
}
}
}
void scaleTransform(int scale, int objectScale, int n)
{
Stack<int, 100> s;
if (n == 0)
s.push(0);
while(n!=0)
{
s.push(n % objectScale);
n /= objectScale;
}
cout << "对应的" << objectScale << "进制数是";
while (!s.empty())
{
if (s.top() < 10)
cout << s.top();
else
cout << static_cast<char>(55 + s.top());
s.pop();
}
cout << endl;
}
double toDecimal(const char* s, int scale)
{
int p = 0;
double result = 0;
int l = strlen(s);
while (p != strlen(s))
{
if (s[p] < 58)
//是数字
result += (static_cast<double>(s[p]) - 48) * pow(scale, l - 1);
else
//是字母
result += static_cast<double>(tolower(s[p]) - 87) * pow(scale, l - 1);
l--;
p++;
}
return result;
}