数据结构(六)队列的链表实现、基于vector/list自定义栈、检测括号配对与嵌套、自定义栈中缀变后缀

1、队列的链表实现

代码:

//请在DEV中运行,先勾选“Tools" -勾选”Compailer Options"-再勾选"Add~~~“-框框中输入"-std=c++11” 
/*链队列的实现*/
#include <iostream>
using namespace std;
 
/*链队列类型定义*/
typedef struct QNode
{
       struct QNode * next;
       char data;
}QNode,*queuePtr;//结点的定义
 
typedef struct linkQueue
{
       queuePtr rear;
       queuePtr front;
}linkQueue;//队列的定义
 
/*链队列的初始化*/
void initQueue_L(linkQueue &Q)
{
       Q.front=Q.rear=new QNode;//为队列申请一个空间
       Q.front->next=0;//使队列的头指针指向空
}
 
 
/*销毁链队列*/
void destroyQueue_L(linkQueue &Q)
{
       while(Q.front)
       {
              queuePtr p;
              p=Q.front;
              Q.front=Q.front->next;
              delete p;//销毁链队列得把结点一个一个销毁掉
       }
}
 
/*求链队列的长度*/
int lengthQueue_L(linkQueue &Q)
{
       QNode *p;
       int count;
       p=Q.front->next;
       count=1;
       while(p)
       {
              p=p->next;
              count++;
       }
       return count;
}
 
/*入队*/
void enterQueue_L(linkQueue &Q,char x)
{
       QNode *p;
       p=new QNode;
       p->data=x;
       p->next=0;
Q.rear->next=p;
/*这里和顺序队列不一样,此处的rear不是指向队列最后一个元素的下一个位置,
而就是指向队列的最后一个元素。要知道Q.rear和Q.front都是指针。*/
       Q.rear=p;
}//这里没有队满的情况。
 
/*出队*/
char outputQueue_L(linkQueue &Q)
{
       char x;
       if(Q.front->next==0)//这里得考虑队列空的情况。
              cout<<"Queue Empty!"<<endl;
       QNode *p;
       p=Q.front->next;
	   /*应该注意顺序队列和链队列的不同之处,链队列中rear指向最后一个元素,
	   front指向头结点,即第一个结点的前一个结点。而在顺序队列中正好相反,
	   rear指向队列中的最后一个元素的下一个位置,而front就是指向第一个结点。*/
       x=p->data;
       Q.front->next=p->next;
       if(Q.rear==p)
              Q.rear=Q.front;
       delete p;
       return x;
}
 
int main()
{
       linkQueue Q;
       initQueue_L(Q);
       enterQueue_L(Q,'a');
       enterQueue_L(Q,'b');
       enterQueue_L(Q,'c');
       enterQueue_L(Q,'d');
       cout<<outputQueue_L(Q)<<endl;
       cout<<outputQueue_L(Q)<<endl;
       cout<<outputQueue_L(Q)<<endl;
       cout<<outputQueue_L(Q)<<endl;
       //cout<<outputQueue_L(Q)<<endl;
       destroyQueue_L(Q);
}

运行:

2、基于list自定义Stack

代码:

//请在DEV中运行,先勾选“Tools" -勾选”Compailer Options"-再勾选"Add~~~“-框框中输入"-std=c++11” 
#include<iostream>
#include<algorithm>
#include<list>
using namespace std;
template <class ElementType>
class ChainNode
{
	public:
		ElementType data;
		ChainNode<ElementType>*link;
};
template<class ElementType>
class ChainStack
{
	public:
		ChainStack()
		{
			top=NULL;
		}
		~ChainStack()
		{
			ChainNode<ElementType>*nextptr;
			while(top)
			{
				nextptr=top->link;
				delete top;
				top=nextptr;
			}
		}
		bool IsEmpty()
		{
			return top==NULL;
		}
		bool GetTop(ElementType&result)
		{
			if(IsEmpty())return false;
			result=top->data;
			return true;
		}
		bool Push(ElementType&newvalue)
		{
			ChainNode<ElementType>*p=new ChainNode<ElementType>;
			p->data=newvalue;
			p->link=top;
			top=p;
			return true;
		}
		bool Pop(ElementType&result)
		{
			if(IsEmpty())return false;
			ChainNode<ElementType>*p=top;
			top=top->link;
			delete p;
			return true;
		}
		private:
			ChainNode<ElementType>*top;
};
int main()
{
	ChainNode <int>  cn;
	ChainStack <int> cs;
	for(int i=0;i<5;i++)
	cs.Push(i);
	cout<<"栈是否为空:"<<endl; 
	cout<<cs.IsEmpty()<<endl;
	for(int i=5;i>=0;i--)
	cs.Pop(i);
	cout<<"栈是否为空:"<<endl; 
	cout<<cs.IsEmpty()<<endl;
	return 0;
} 

运行:

3、基于vector自定义Stack

代码:

//请在DEV中运行,先勾选“Tools" -勾选”Compailer Options"-再勾选"Add~~~“-框框中输入"-std=c++11” 
//main.cpp:
//#include "Stack.h"
#include <iostream>
#include <string>
#include <vector>
//using std::vector
//using std::string;
using namespace std;
//Stack.h:

//#pragma once

class Stack
{
public:
 Stack(vector<string> &vec){ _stack = vec; };//自定义了一个操作vector<string>类型的stack类
 ~Stack(){};

 bool push(const string&);
 bool pop(string &elem);
 bool seek(string &elem);

 inline bool empty();
 inline bool full();

 int size(){return _stack.size();}

private:
 vector<string> _stack;
};

//Stack.cpp:
//#include "Stack.h"
bool Stack::push(const string& elem)//元素进栈
{
 if (full())
 {
  return false;
 }

 _stack.push_back(elem);

 return true;
}

bool Stack::pop(string &elem)//元素出栈
{
 if (empty())
 {
  return false;
 }

 elem = _stack.back();
 _stack.pop_back();
 return true;
}

bool Stack::seek(string &elem)//元素查找 
{
 if (empty())
 {
  return false;
 }

 elem = _stack.back();
 return true;
}

inline bool Stack::empty()//判断元素是否为空 
{
 return _stack.empty();
}

inline bool Stack::full()//判断元素已满 
{
 return _stack.size() == _stack.max_size();
}

int main()
{
 vector<string> vec(5,"2"); 
 Stack s(vec);
 string str;
 bool cond = false;

 if (!s.empty())
 {
  cout<<"Stack s is not empty."<<endl;
 }

 if (s.full())
 {
  cout<<"Stack s is full."<<endl;
 }

 if (s.pop(str))
 {
  cout<<"pop str:"<<str<<endl;
 }

 if (s.seek(str))
 {
  cout<<"seek str:"<<str<<endl;
 }

 if (s.push(str))
 {
  cout<<"push str:"<<str<<endl;
 }

 cout<<"Stack size is:"<<s.size()<<endl;

 return 0;
}

运行:

4、检测括号配对与嵌套

代码:

//请在DEV中运行,先勾选“Tools" -勾选”Compailer Options"-再勾选"Add~~~“-框框中输入"-std=c++11” 
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

#define stacksize 100

struct stack
{
    char strstack[stacksize];
    int top;
};

void InitStack(stack &s)
{
    s.top=-1;
}

char Push(stack &s,char a)
{
    if(s.top==stacksize-1)
    {
        return 0;
    }
    s.top++;
    s.strstack[s.top]=a;
    return a;
}

char Pop(stack &s)
{
    if(s.top==-1)
    {
        return 0;
    }
    char a=s.strstack[s.top];
    s.top--;
    return a;
}

int Empty(stack &s,int re)
{
    if(s.top==-1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

int Check(char *str)
{
    stack s;
    InitStack(s);
    int strn=strlen(str);
    for(int i=0;i<strn;i++)
    {
        char a=str[i];
        switch (a)
        {
        case '(':
        case '[':
        case '{':
            Push(s,a);
            break;
        case ')':
            if(Pop(s)!='(')
            {
                return 0;
            }
            break;
        case ']':
            if(Pop(s)!='[')
            {
                return 0;
            }
            break;
        case '}':
            if(Pop(s)!='{')
            {
                return 0;
            }
            break;
        }
    }
    int re=0;
    re=Empty(s,re);
    if(re==1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
int main()
{
    char str[20];
    cout<<"请输入一个长度小于20的字符串:"<<endl;
    cin>>str;
    int re=Check(str);
    if(re==1)
    {
        cout<<"你输入的字符串括号完全匹配!"<<endl;
    }
    else if(re==0)
    {
        cout<<"你输入的字符串括号不匹配!"<<endl;
    }
}

运行:

5、中缀变后缀

代码:

//请在DEV中运行,先勾选“Tools" -勾选”Compailer Options"-再勾选"Add~~~“-框框中输入"-std=c++11” 
#include<stdio.h>
#define Max 20
//自定义栈
template<class Elem>
struct Stack{
    int top;
    Elem *p;
    int size;};
 template<class Elem>
 void Set_Ssize(Stack<Elem> &sta,int n){
     sta.size=n;
     sta.p=new Elem[sta.size];
     sta.top=0;
 }
 template<class Elem>
 void Push(Stack<Elem> &sta,Elem item){
     sta.p[sta.top++]=item;
 }
 template<class Elem>
 void Pop(Stack<Elem> &sta,Elem &e){
     e=sta.p[--sta.top];
 }
 template<class Elem>
 bool IsEmpty(Stack<Elem> &sta){
     return sta.top==0;
 }
 template<class Elem>
 bool IsFull(Stack<Elem> &sta){
     return sta.top==sta.size;
 }
 //自定义队列
 template<class Elem>
 struct MyQuene{
     int front;
     int rear;
     Elem *p;
     int size;
 };
 template<class Elem>
 void Set_Qsize(MyQuene<Elem> &Q,int n){
     Q.size=n;
     Q.front=0;
     Q.rear=0;
     Q.p=new Elem[Q.size];
 }    
 template<class Elem>
 void AddQuene(MyQuene<Elem> &Q,Elem item){
     Q.p[Q.rear++]=item;
     if(Q.rear==Q.size)
         Q.rear=0;
 }
 template<class Elem>
 void DeleteQuene(MyQuene<Elem> &Q,Elem& e){
     e=Q.p[Q.front++];
     if(Q.front==Q.size)
         Q.front=0;
 }
 template<class Elem>
 Elem GetTop(Stack<Elem> &sta){
     return sta.p[sta.top-1];
 }
 template<class Elem>
 bool IsEmpty(MyQuene<Elem> &Q){
     return Q.front==Q.rear;
 }
 template<class Elem>
 bool IsFull(MyQuene<Elem> &Q){
     int len=Q.front<Q.rear ?Q.rear-Q.front:Q.rear-Q.front+Q.size;
     return len==Q.size-1;
 }
 //定义运算符的优先级
 int GetPrecedence(char a){
     switch(a){
     case '#':return 0;
     case '+':
     case '-':return 1;
     case '*':
     case '/':return 2;
     case '^':return 3;
     default:break;
     }
 }
 template<class Elem>
 void Middle_Bhind(Stack<Elem> &st,MyQuene<Elem>&Mq,char*A,int n){//中缀表达式转为后缀表达式(自己的实验需求)
     Set_Ssize(st,n);
     Set_Qsize(Mq,n+1);
     char tem;
     int i=0;
     Push(st,'#');
	     do{
         if((A[i]>='0'&&A[i]<='9')||(A[i]>='A'&&A[i]<='Z')||(A[i]>='a'&&A[i]<='z'))
             AddQuene(Mq,A[i]);
         else if(A[i]=='(')
             Push(st,A[i]);
         else if(A[i]==')'){
             while(GetTop(st)!='('){
                 Pop(st,tem);
                 AddQuene(Mq,tem);
            }
            Pop(st,tem);
        }
        else if(GetTop(st)=='(')
            Push(st,A[i]);
        else{
            while(GetPrecedence(A[i])<=GetPrecedence(GetTop(st))){
                Pop(st,tem);
                AddQuene(Mq,tem);
            }
            Push(st,A[i]);
        }
        i++;
    }while(A[i]!='\0');
    while(GetTop(st)!='#'){
        Pop(st,tem);
        AddQuene(Mq,tem);
    }
    while(!IsEmpty(Mq)){
        DeleteQuene(Mq,tem);
        printf("%c",tem);
    }
    putchar('\n');
}
int main(){
    char str[Max];
    Stack<char> st;
    MyQuene<char>Mq;
    printf("请输入中缀表达式:");
    gets(str);
    printf("后缀表达式:");
    Middle_Bhind(st,Mq,str,Max);
}

运行:

猜你喜欢

转载自blog.csdn.net/RayMa0305/article/details/81448970