C++模板和用双向链表实现queue队列

时间:2022-01-25 17:41:22

使用C++模板:

Template <class或者也可以用typename T>
template <class T>//template是标识符
说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个 ,每个形参前都要加class <类型 形参表>可以包含基本数据类型可以包含类类型.
注意:template <class T> 有效期只有一次,需要多少次要声明多少次
使用时只要用node<T>即可
实例:
template <class T>
struct stack {
T* st;
int tp;
stack() {
tp = -1;
st = new T[1000];
}
 
void pop() {
if(tp == -1) {
    int a = 1 / 0;
}
--tp;
}
T top() {
if(tp == -1) {
int a = 1/ 0;
}
return st[tp--];
}
void push(T a) {
st[++tp] = a;
}
 
bool empty() {
return tp == -1;
}
 
void clear() {
tp = -1;
}
};
int main() {
stack<char> st;
 
char s[1000];
while(cin >> s){
st.clear();
bool f = true;
for(char* k = s; *k; k++) {
if(*k == '(') st.push(*k);
else {
if(st.empty()) {
f = false;
break;
} else {
st.pop();
}
}
}
cout<<f<<endl;
}
}//以上为师傅代码
以上代码实现栈的基本功能并利用所写的栈来实现括号匹配。
使用双向链表来实现队列并利用所写的堆来实现树的层次遍历
#include <iostream>
#include <vector>
using namespace std;
template <class T>
struct node{
 node *next;
     node *prior;
 T data;
 node(){
 }
};
template <class T>//有效期只有一次 
struct Q{
node<T>* front;//长见识了
node<T>* end;
Q(){
front=NULL;
end=NULL;
}
void push(T a){
node<T> *n=new node<T>();
n->data=a;
if(!front) {
front=n;
front->prior=NULL;
}
if(!end) {
end=n;
// n-> prior=NULL;
}
else{
n->prior=end;
end->next=n;
end=n;
}
end->next=NULL;
 
}
void pop(){
if(!front) {
cout<<"error ::the queue is NULL"<<endl;
return ;
}
node<T> *n;
n=front;
front=n->next;
if(front)
   front->prior=NULL;
else end=NULL; 
delete(n);
}
T visitTop(){
if(front)
   return front->data;
else {
cout<<"error"; 
return NULL;
}
}
bool empty(){
if(!front) return 1;
else return 0;
}
 
};
struct TreeNode {
      int val;
      TreeNode *left;
      TreeNode *right;
      TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
struct Node {
    TreeNode *u;
    int level;
    Node(TreeNode *a=NULL,int b=0){
     u=a;
     level=b;
}
};
class Solution {
public:
    vector<vector<int> > levelOrder(TreeNode *root) {
     vector<vector<int> > vv;
        Q<Node> q;
        vector<int> E;
        if(root!=NULL) 
{
q.push(Node(root,0));
}
        while(!q.empty())
        {
            Node temp=q.visitTop();
            q.pop();
         int level=temp.level;
         if(vv.size()==level){//NULL树的特殊处理 
         vv.push_back(E);//NULL树的特殊处理 
         }//NULL树的特殊处理 
         if(temp.u->left) {q.push(Node(temp.u->left,level+1));}
         if(temp.u->right) {q.push(Node(temp.u->right,level+1));}
         vv[level].push_back(temp.u->val);
        }//很傻的方法,要多看看师傅的代码
        return vv;
    }
};
int main ()
{
TreeNode root(1);
Solution s;
s.levelOrder(&root);
 
return 0;
}

 师傅博客:http://ofpsxx.com