我写的感觉好复杂用了三个stack
#include<iostream>
using namespace std;
const int STOCK_SIZE = 100;//定义栈的大小
template<class DataType>
class DSStack
{
public:
DSStack(DataType[], int);
DSStack();
~DSStack();
void Push(DataType data);
DataType Pop();
void Clear();
void Print();
DataType GetTopData();
private:
DataType elem[STOCK_SIZE];
DataType *top;
DataType *bottom;
int Count;
};
template<class DataType>
DSStack<DataType>::DSStack(DataType data[], int len)
{
bottom = elem; // 栈底初始指向
top = bottom; // 初始栈底与栈顶指针指向相同的位置
for (int i = 1; i <= len; i++)
{
elem[i] = data[i];
Count++;
}
}
template<class DataType>
DSStack<DataType>::DSStack()
{
bottom = elem; // 栈底初始指向
top = bottom; // 初始栈底与栈顶指针指向相同的位置
Count = 0;
}
template<class DataType>
DSStack<DataType>::~DSStack()
{
}
template<class DataType>
void DSStack<DataType>::Push(DataType data)
{
if (Count > STOCK_SIZE) return;
Count++;
elem[Count] = data;
}
template<class DataType>
DataType DSStack<DataType>::Pop()
{
if (Count < 1) return -1;
DataType data;
data = elem[Count];
Count--;
return data;
}
template<class DataType>
void DSStack<DataType>::Clear()
{
top = bottom;
Count = 0;
}
template<class DataType>
void DSStack<DataType>::Print()
{
cout << "栈的数据: " << endl;
for (int i = 1; i <= Count; i++)
{
cout << " " << elem[i] << endl;
}
}
template<class DataType>
DataType DSStack<DataType>::GetTopData()
{
if (Count == 0) return -1;
return elem[Count];
}
void main()
{
DSStack<char> *stack_addend = new DSStack<char>();
DSStack<char> *stack_augend = new DSStack<char>();
DSStack<int> *stack_retult = new DSStack<int>();
cout << "请输入加数以#结束" << endl;
char s = ' ';
cin >> s;
while (s != '#')
{
stack_addend->Push(s);
cin >> s;
}
stack_addend->Print();
cout << "请输入被加数以#结束" << endl;
s = ' ';
cin >> s;
while (s != '#')
{
stack_augend->Push(s);
cin >> s;
}
stack_augend->Print();
bool is_carry = false; // 是否进位
while ((stack_addend->GetTopData() != -1) || (stack_augend->GetTopData() != -1) || is_carry)
{
// 考虑到两个数的位数不一定相等,把没有的弄为0
if (stack_addend->GetTopData() == -1)
{
stack_addend->Pop();
stack_addend->Push(48);
}
if (stack_augend->GetTopData() == -1)
{
stack_augend->Pop();
stack_augend->Push(48);
}
char addend = stack_addend->Pop();
char augend = stack_augend->Pop();
int result = 0;
if (is_carry)
{
result = ((int)addend - 48) + ((int)augend - 48) + 1;
is_carry = false;
}
else
{
result = ((int)addend - 48) + ((int)augend - 48);
}
if (result >= 10) // 如果的出来的结果是两位数
{
int temp = result % 10;
stack_retult->Push(temp);
is_carry = true;
//stack_retult->Push(result / 10);
}
else
{
stack_retult->Push(result);
}
}
stack_retult->Print();
getchar();
getchar();
}
|