实验四

头文件
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值