实验二
一.
(1)顺序栈的实现
//exp2_1.cpp--设计一个顺序栈,实现出栈和入栈操作
#include<iostream>
using namespace std;
const int StackSize = 5;
template <typename T>
class Stack
{
private:
int top;
T data[StackSize];
public:
Stack() { top = -1; }
~Stack(){}
void input(T x);
T Pop();
int Gettop() { return top; }
};
int main()
{
Stack<int> st;
st.input(5);
st.input(4);
cout << st.Pop();
cout<<st.Gettop();
return 0;
}
template <typename T>
void Stack<T>::input(T x)
{
if (top >= StackSize - 1) throw"overflow";
data[++top] = x;
}
template <typename T>
T Stack<T>::Pop()
{
if (top <= -1) throw"underflow";
T x;
x = data[top--];
return x;
}
(2)链栈的实现
//exp2_1.cpp--设计一个链栈,实现出栈和入栈操作
#include<iostream>
using namespace std;
template <typename T>
class Stack
{
private:
struct Node
{
T data;
Node *next;
};
Node *top;
public:
Stack() { top = NULL; }
~Stack(){}
void input(T x);
T Pop();
T Gettop() { if (top != NULL) return top->data; }
};
int main()
{
Stack<int> st;
st.input(5);
st.input(4);
st.input(3);
cout << st.Pop();
cout << st.Gettop();
return 0;
}
template <typename T>
void Stack<T>::input(T x)
{
Node *s = new Node;
s->data = x;
s->next = top;
top = s;
}
template <typename T>
T Stack<T>::Pop()
{
if (top == NULL) throw "underflow";
T x;
Node *p = top;
x = top->data;
top = top->next;
delete p;
return x;
}
(3)顺序队列的实现
//exp2_2--建立顺序队列,实现入队和出队操作
#include<iostream>
using namespace std;
const int Queue = 5;
template<typename T>
class CirQueue
{
private:
int rear, front;
T data[Queue];
public:
CirQueue() { rear = front = Queue-1; }
~CirQueue(){}
void input(T x);
T output();
T Getfront();
};
int main()
{
CirQueue<int> cir;
cir.input(5);
cir.input(4);
cout<<cir.output();
cout<<cir.Getfront();
return 0;
}
template<typename T>
void CirQueue<T>::input(T x)
{
if ((rear+1)%Queue == front) throw"overflow";
rear = (rear + 1) % Queue;
data[rear] = x;
}
template<typename T>
T CirQueue<T>::output()
{
if (rear == front) throw "underflow";
front = (front + 1) % Queue;
return data[front];
}
template<typename T>
T CirQueue<T>::Getfront()
{
if (rear == front) throw "underflow";
return data[(front+1)%Queue];
}
4.链队列的实现
//exp2_2--建立链队列,实现入队和出队操作
#include<iostream>
using namespace std;
template<typename T>
class LinkQueue
{
private:
struct Node
{
T data;
Node *next;
};
Node *rear, *front;
public:
LinkQueue() { Node *s = new Node; rear = front = s; }
~LinkQueue(){}
void input(T x);
T output();
T Getfront();
};
int main()
{
LinkQueue<int> lik;
lik.input(5);
lik.input(4);
cout<<lik.output();
cout<<lik.Getfront();
return 0;
}
template<typename T>
void LinkQueue<T>::input(T x)
{
Node *s = new Node;
s->data = x;
rear->next = s;
rear = s;
}
template<typename T>
T LinkQueue<T>::output()
{
if (rear == front) throw "underflow";
T x;
Node *p;
x = front->next->data;
p = front->next;
front->next = p->next;
delete p;
return x;
}
template<typename T>
T LinkQueue<T>::Getfront()
{
if (rear == front) throw "underflow";
return front->next->data;
}
二.设计算法并写出代码,实现一个十将二进制转换成2进制数
//exp3_2--十进制转二进制
#include<iostream>
using namespace std;
const int MAX = 64;
void dec_to_bin(int); //正数的十进制转二进制
void negative_dec_to_bin(int); //负数的十进制转二进制
int main()
{
cout << "Enter a decimal number: ";
int dec_num;
cin >> dec_num;
if (dec_num < 0) negative_dec_to_bin(dec_num);
else if (dec_num == 0) cout << "The decimal number " << dec_num << " conversion to binary is: " << dec_num;
else dec_to_bin(dec_num);
cout << endl << "BYB!";
return 0;
}
void negative_dec_to_bin(int dec)
{
int temp;
temp = -dec; //负数转为正数以求出原码
int data[MAX]; //定义一个int数组以存储二进制代码
int count = 0; //count变量计算该数字由多少位二进制组成
while (temp != 1)
{
data[count] = temp % 2;
count++;
temp = temp / 2;
}
data[count] = 1; //大于0的十进制的数字,其二进制第一位必为0
for(int i=count;i>=0;i--) //循环使原码转换为反码
{
if (data[i] == 0) data[i] = 1;
else data[i] = 0;
}
for(int j=count;j>=0;j--) //使反码转为补码
{
if (data[j] == 0) { data[j] = 1; break; }
if (data[j] == 1) data[j] = 0;
}
for (int k = 0; k <= count; k++) //输出补码
cout << data[k ];
}
void dec_to_bin(int dec)
{
int temp;
temp = dec;
int data[MAX];
int count = 0;
while(temp!=1) //求出二进制代码
{
data[count] = temp % 2;
count++;
temp = temp / 2;
}
data[count] = 1;
for(;count>=0;count--)
cout << data[count];
}