链栈和顺序队列的实现

1.链栈

源代码:

#include <iostream>
using namespace std;


template<class DataType>
struct Node {
    DataType data;
    Node<DataType> *next;
    Node<DataType>(DataType x) {
        data = x;
        next = NULL;
    }
};


template <class DataType>
class LinkStack {
public:
    LinkStack() // 构造函数 初始化一个空栈
{ top = NULL; }
    ~LinkStack() // 析构函数
{}
    void Push(DataType x);  // 入栈
    DataType Pop(); // 出栈
    DataType GetTop(); // 去栈顶元素
    bool isEmpty() // 判断是否为空
{ return top == NULL ? true : false;}
    void PrintStack(); // 输出栈
private:
    Node<DataType> *top; // 栈顶指针
};


template <class DataType>
void LinkStack<DataType>::Push(DataType x) 
{
    Node<DataType> *s = new Node<DataType>(x);
    s -> next = top; // 将结点插在栈顶
    top = s;
}


template <class DataType>
DataType LinkStack<DataType>::Pop() 
{
    if (top == NULL) throw "下溢";
    DataType x = top -> data;
    Node<DataType> *p = top;
    top = top -> next;
    delete p;
    return x;
}


template <class DataType>
DataType LinkStack<DataType>::GetTop() 
{
    if (top == NULL) throw "空栈";
    return top -> data;
}


template <class DataType>
void LinkStack<DataType>::PrintStack() 
{
    if (top == NULL) {
        cout << "空栈" << endl;
        return;
    }   
}


int main(int argc, const char * argv[])
 {
    LinkStack<int> stack = LinkStack<int>();
    for (int i = 0; i < 10; i++) {
        stack.Push(i);
    }
    cout << stack.isEmpty() << endl;
    cout << stack.GetTop() << endl;
    cout << "Pop : " << stack.Pop() << endl;
    cout << "Pop : " << stack.Pop() << endl;
    cout << stack.GetTop() << endl;


    return 0;

}


运行结果图:



2.顺序队列:

源代码:

#include<iostream.h>

const int QueueSize = 100;

template<class DataType>

class CirQueue{

public:

CirQueue()              //构造函数,初始化一个空队列

{

front = rear = QueueSize -1;

}

~CirQueue(){}          //析构函数

void EnQueue(DataType x);   //入队

DataType DeQueue();    // 出队

DataType GetQueue();   // 取队头元素

bool isEmpty()         //判断队列是否为空

{ return front == rear ? true : false; }

void PrintQueue();     //输出队列

private:

DataType data[QueueSize];

int front;             // 队头指针

int rear;              // 队尾指针

};

template <class DataType>

void CirQueue<DataType>::EnQueue(DataType x)

{

    if ((rear+1) % QueueSize == front) throw "上溢";

    rear = (rear+1) % QueueSize;

    data[rear] = x;

}

template <class DataType>

DataType CirQueue<DataType>::DeQueue()

{

    if (front == rear) throw "下溢";

    front = (front + 1) % QueueSize;

    return data[front];

}

template <class DataType>

DataType CirQueue<DataType>::GetQueue()

{

    if (front == rear) throw "下溢";

    return data[(front+1) % QueueSize];

}

template <class DataType>

void CirQueue<DataType>::PrintQueue()

{

    int p = front;

    cout << "frint ";

    while ((p+1) % QueueSize != (rear+1) % QueueSize - 1)

{

        cout << data[(++p) % QueueSize] << " <- ";

    }

    cout << data[(rear+1) % QueueSize - 1];

    cout << " rear" << endl;

}

int main(int argc, const char * argv[])

{

    CirQueue<int> queue = CirQueue<int>();

    cout << "isEmpty : " << queue.isEmpty() << endl;

    for (int i = 2; i <= 11; i++)

{

        queue.EnQueue(i);

    }

    queue.PrintQueue();

    cout << "isEmpty : " << queue.isEmpty() << endl;

    cout << "GetQueue : " << queue.GetQueue() << endl;

    cout << "DeQueue : " << queue.DeQueue() << endl;

    cout << "DeQueue : " << queue.DeQueue() << endl;

    queue.PrintQueue();

    cout << "GetQueue : " << queue.GetQueue() << endl;

    return 0;

}


运行结果图:


猜你喜欢

转载自blog.csdn.net/Z_JH1213/article/details/80340280