实验二
一.
(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]; }