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);
}
运行: