2024-3-18

This commit is contained in:
2024-03-18 20:18:12 +08:00
parent 8933bff3c7
commit 59e0405033
51 changed files with 5263 additions and 0 deletions

View File

@@ -0,0 +1,69 @@
/***链栈实现括号匹配***/
#include<string>
#include<iostream>
using namespace std;
#include"LinkStack.h"
//算法3.11 括号的匹配
bool match(string exp)
{
//检验表达式(表达式以"#"结束)中所含"["和"]"、"("和")"是否匹配如果匹配则返回true否则返回false。
//表达式以“#”结束
SNode<char> *S;
InitStack(S);
int flag=1; // 标记查找结果以控制循环及返回结果
char ch;
char e,x;
int i=0;
ch=exp[i++]; // 读入第一个字符
while(ch!='#' && flag)
{
switch (ch)
{
case '[':
case '(': // 若是左括号,则将其压入栈
cout<<"左括号进栈!"<<endl;
Push(S,ch);
break;
case ')' : // 若是右括号“)”,则根据栈顶元素的值分情况考虑
GetTop(S,e);
if (!StackEmpty(S) && e=='(' ) // 若栈非空且栈顶元素是“(”,则匹配成功
{
Pop(S,x);
cout<<"右括号出栈!"<<endl;
}
else
flag=0; // 若栈空或栈顶元素不是“(”,则非法
break;
case ']' : // 若是右括号“]”,则根据栈顶元素的值分情况考虑
GetTop(S,e);
if (!StackEmpty(S) && e=='[' ) // 若栈顶元素是“[”,则匹配成功
Pop(S,x);
else
flag=0; // 若栈空或栈顶元素不是“[”,则非法
break;
}//switch
ch=exp[i++]; //继续读入下一个字符
}//while
if (StackEmpty(S) && flag ) // 栈空且标志为true,括号匹配返回true
return true;
else // 否则,括号不匹配,返回false
return false;
}//match
int main()
{
int flag;
string exp;
cout<<"请输入待匹配的表达式,以“#”结束:"<<endl;
cin>>exp;
flag = match(exp);
if(flag)
cout<<"括号匹配成功!"<<endl;
else
cout<<"括号匹配失败!"<<endl;
return 0;
}//end of main function

View File

@@ -0,0 +1,92 @@
template <class DT>
struct SNode //结点
{
DT data; //数据域,存储数据元素值
SNode *next;//指针域,指向下一个结点
};
//【算法3.6】
template <class DT>
void InitStack(SNode<DT> *&S)//创建空链栈
{
S=NULL;
}
//【算法3.7】
template <class DT>
void DestroyStack(SNode<DT> *(&S))//释放链栈
{
SNode<DT> *p;
while(S)//从头结点开始,依次释放结点
{
p=S;
S=S->next;
delete p;
}
//L=NULL;//头结点指向空
}
//【算法3.8】
template<class DT>
bool Push(SNode<DT> *&S,DT e)
{
SNode<DT> *p;
p=new SNode<DT>;
if(!p) return false; //创建失败,结束运行
p->data=e; // 新结点赋值
p->next=S; //结点S链接到p结点之后
S=p;
return true; // 插入成功返回true
}
//【算法3.9】
template<class DT>
bool Pop(SNode<DT> *&S,DT &e)
{
SNode<DT> *p;
if(S==NULL) return false;
p=S;
e=p->data;
S=S->next;
delete p;
return true; // 删除成功返回true
}
//【算法3.10】
template<class DT>
bool GetTop(SNode<DT> *S,DT &e)
{
SNode<DT> *p;
if(S==NULL) return false;
p=S;
e=p->data;
return true; // 删除成功返回true
}
//测栈空
template<class DT>
bool StackEmpty(SNode<DT> *S)
{
if(S==NULL)
return true;
else
return false;
}
//显示栈内容
template<class DT>
void DispStack(SNode<DT> *S)
{
SNode<DT> *p;
p=S;
while(p)
{
cout<<p->data<<"\t";
p=p->next;
}
cout<<endl;
}

View File

@@ -0,0 +1,158 @@
#include<iostream>
#include<string>
using namespace std;
struct dancer // 舞者信息
{ string name; // 姓名
char sex; // 性别
};
struct Node // 队列结点
{ dancer data; // 数据域
Node* next; // 指针域,指向后继
}*front,*rear; // 队头、队尾
struct LinkQueue
{ Node *front;
Node *rear;
}; // 男队和女队
void InitialLinkQueue(LinkQueue &Q) // 初始化队列
{
Q.front=new Node;
Q.front->next=NULL;
Q.rear=Q.front;
}
void DestroyLinkQueue(LinkQueue &Q) // 销毁队列
{ Node *p;
while(Q.front!=NULL)
{ p=Q.front;
Q.front=Q.front->next;
delete p;
}
}
void EnQueue(LinkQueue &Q,dancer &e) // 入队
{
Node *s=new Node;
s->data=e;
s->next=Q.rear->next;
Q.rear->next=s;
Q.rear=s;
}
bool IsEmpty(LinkQueue Q) // 判队空
{
if (Q.front==Q.rear)
return true;
else
return false;
}
bool DeQueue(LinkQueue &Q,dancer &e) // 出队
{
Node *p;
if (IsEmpty(Q)) // 队空,
{
cout<<"队列为空,无法出队列!";
return false;
}
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if (p==Q.rear) // 只有一个元素,出队
Q.rear=Q.front; // 修改队尾指针
delete p;
return true;
}
bool GetHead(LinkQueue Q,dancer &e)
{ if(IsEmpty(Q)) // 队空
{
cout<< "队列为空,无法取得队首元素!";
return false;
}
e=Q.front->next->data; // 返回队头元素
return true;
}
void QueueTranverse(LinkQueue Q) // 遍历队
{ Node *p;
p=Q.front->next;
while(p!=NULL)
{ cout<<(p->data).name<<" ";
p=p->next;
}
cout<<endl;
}
void EntranHall(dancer person[],int num) // 舞者入场
{
int i;
for(i=0;i<num;i++)
{
cout<<"请输入第"<<i+1<<"个舞者性别(F(女) or M(男))及姓名:"<<endl;
cin>>person[i].sex;
cin>>person[i].name;
}
cout<<"现有舞者:"<<endl;
for(i=0;i<num;i++)
{
cout<<i+1<<":"<<person[i].sex
<<","<<person[i].name<<endl;
}
}
//算法3.24
void DancePartner(dancer person[],int num)
{
dancer newdancer,m,f,p;
LinkQueue GenQueue;
LinkQueue LadyQueue;
InitialLinkQueue(GenQueue); // 初始化男队
InitialLinkQueue(LadyQueue); // 初始化女队
for(int i=0;i<num;i++) // 舞者入场
{ p=person[i];
if(p.sex=='F')
EnQueue(LadyQueue,p);
else
EnQueue(GenQueue,p);
}
while ( (!IsEmpty(GenQueue)) && (!IsEmpty(LadyQueue)) ) // 匹配舞者
{
DeQueue(GenQueue,m); // 女士出队
DeQueue(LadyQueue,f); // 男士出队
cout<<m.name <<"<---配对--->"<<f.name<<endl; // 男、女配队
}
if (!IsEmpty(GenQueue))
{
GetHead(GenQueue,m);
cout<<m.name<<"先生还在等着呢!"<<endl;
}
else if (!IsEmpty(LadyQueue))
{
GetHead(LadyQueue,f);
cout<<f.name<<"女士还在等着呢!"<<endl;
}
else
cout<<"配对完美结束!"<<endl;
DestroyLinkQueue(GenQueue); // 销毁队列
DestroyLinkQueue(LadyQueue);
}
int main()
{
dancer *person;
int num;
cout<<"请输入舞伴总数量:"<<endl;
cin>>num;
person=new dancer[num];
EntranHall(person, num); // 舞者入场
DancePartner(person,num); // 舞者匹配
return 0;
}

View File

@@ -0,0 +1,112 @@
template <class DT>
struct QNode //结点
{
DT data; //数据域,存储数据元素值
QNode *next;//指针域,指向下一个结点
};
template<class DT>
struct LinkQueue
{
QNode<DT> * front;
QNode<DT> * rear;
};
//【算法3.19】
template <class DT>
void InitQueue(LinkQueue<DT> &Q)//创建空队列
{
Q.front=new QNode<DT>; //创建头结点
if(!Q.front) exit(1); //创建失败,结束运行
Q.front->next=NULL;
Q.rear=Q.front;
}
//【算法3.20】
template <class DT>
void DestroyQueue(LinkQueue<DT> &Q)//释放链队
{
QNode<DT> *p;
while(Q.front)//从头结点开始,依次释放结点
{
p=Q.front;
Q.front=Q.front->next;
delete p;
}
}
//【算法3.21】 入队
template<class DT>
bool EnQueue(LinkQueue<DT> &Q,DT e)
{
QNode<DT> *p;
p=new QNode<DT>; // 创建新结点
if(!p) return false; // 创建失败,结束运行
p->data=e; // 新结点赋值
p->next=NULL; // 链在队尾
Q.rear->next=p;
Q.rear=p;
return true; // 入队成功返回true
}
//【算法3.22】 出队
template<class DT>
bool DeQueue(LinkQueue<DT> &Q,DT &e)
{
QNode<DT> *p;
if(Q.front==Q.rear) return false; //队空返回false
p=Q.front->next; // 取出队元素
e=p->data;
Q.front->next=p->next; //队首元素出队
if(Q.rear==p) //只有一个元素时出队,
Q.rear=Q.front; // 修改队尾
delete p;
return true; // 出队成功返回true
}
//【算法3.23】 取队头元素
template<class DT>
bool GetHead(LinkQueue<DT> Q,DT &e)
{
if(Q.front==Q.rear) return false; // 队空返回false
e=Q.front->next->data;
return true; // 删除成功返回true
}
//取队尾元素
template<class DT>
bool GetTail(LinkQueue<DT> Q,DT &e)
{
if(Q.front==Q.rear) // 队空
return false; // 返回false
e=Q.rear->data; // 获取队尾元素
return true; // 返回true
}
//测队空
template<class DT>
bool QueueEmpty(LinkQueue<DT> Q)
{
if(Q.front==Q.rear) // 队空
return true; //返回true
else //非空
return false; //返回false
}
//显示队列内容
template<class DT>
void DispQueue(LinkQueue<DT> Q)
{
QNode<DT> *p;
p=Q.front->next;
while(p)
{
cout<<p->data<<"\t";
p=p->next;
}
cout<<endl;
}

View File

@@ -0,0 +1,108 @@
#include<iostream> //cout,cin
using namespace std;
#include "LinkQueue.h"
void dispmenu()
{//显示主菜单
cout<<endl;
cout<<"1-初始化链队\n";
cout<<"2-元素入队\n";
cout<<"3-元素出队\n";
cout<<"4-取队头元素\n";
cout<<"5-取队尾元素\n";
cout<<"6-清空队\n";
cout<<"7-测队空\n";
cout<<"8-显示队列元素\n";
cout<<"0-退出\n";
}
char pause;
//主函数
int main()
{
int e;
LinkQueue<int> Q;
system("cls"); // 执行系统命令cls清屏
int choice;
do
{
dispmenu(); // 显示主菜单
cout<<"功能选择(1~80 退出):";
cin>>choice;
switch(choice)
{
case 1: // 初始化链队
InitQueue(Q);
cout<<endl<<"创建成功!"<<endl;
break;
case 2: //入队
cout<<"输入要插入的元素值:"<<endl;
cin>>e;
cout<<endl;
if(EnQueue(Q,e))
{
cout<<endl<<"入队成功!队列元素为:"<<endl;
DispQueue(Q);
}
else
cout<<endl<<"入队不成功!"<<endl;
break;
case 3: // 出队
if(DeQueue(Q,e))
{
cout<<endl<<"出队成功!出队元素为:"<<e<<endl;
cout<<endl<<"出队后,队列元素为:"<<endl;
DispQueue(Q);
}
else
cout<<endl<<"队空,出队失败!"<<endl;
break;
case 4: // 获取队头元素
if(GetHead(Q,e))
{
cout<<"队列元素为:"<<endl;
DispQueue(Q);
cout<<endl<<"队头元素为:"<<e<<endl;
}
else
cout<<endl<<"队空!"<<endl;
break;
case 5: // 获取队尾元素
if(GetTail(Q,e))
{
cout<<"队列元素为:"<<endl;
DispQueue(Q);
cout<<endl<<"队尾元素为:"<<e<<endl;
}
else
cout<<endl<<"队空!"<<endl;
break;
case 6: // 清空队
ClearQueue(Q);
cout<<endl<<"队已空!"<<endl;
case 7: // 测队空
if(QueueEmpty(Q))
cout<<endl<<"空队!"<<endl;
else
cout<<endl<<"不是空队!"<<endl;
break;
case 8: // 查看队列元素
DispQueue(Q);
cout<<endl;
break;
case 0: // 退出
DestroyQueue(Q);
cout<<"结束运行Bye-bye!"<<endl;
break;
default: // 无效选择
cout<<"无效选择!\n";
break;
}
}while(choice!=0);
return 0;
}//end of main function

View File

@@ -0,0 +1,127 @@
template <class DT>
struct QNode //结点
{
DT data; //数据域,存储数据元素值
QNode *next;//指针域,指向下一个结点
};
template<class DT>
struct LinkQueue
{
QNode<DT> * front;
QNode<DT> * rear;
};
//【算法3.19】
template <class DT>
void InitQueue(LinkQueue<DT> &Q)//创建空队列
{
Q.front=new QNode<DT>; //创建头结点
if(!Q.front) exit(1); //创建失败,结束运行
Q.front->next=NULL;
Q.rear=Q.front;
}
//【算法3.20】
template <class DT>
void DestroyQueue(LinkQueue<DT> &Q)//释放链队
{
QNode<DT> *p;
while(Q.front)//从头结点开始,依次释放结点
{
p=Q.front;
Q.front=Q.front->next;
delete p;
}
Q.rear=Q.front=NULL;
}
template <class DT>
void ClearQueue(LinkQueue<DT> &Q) // 清空链队
{
QNode<DT> *p;
while(Q.front->next) //从队头开始,依次释放结点
{
p=Q.front->next;
Q.front->next=p->next;
delete p;
}
Q.front->next=NULL; // 空队
Q.rear=Q.front;
}
//【算法3.21】 入队
template<class DT>
bool EnQueue(LinkQueue<DT> &Q,DT e)
{
QNode<DT> *p;
p=new QNode<DT>; // 创建新结点
if(!p) return false; // 创建失败,结束运行
p->data=e; // 新结点赋值
p->next=NULL; // 链在队尾
Q.rear->next=p;
Q.rear=p;
return true; // 入队成功返回true
}
//【算法3.22】 出队
template<class DT>
bool DeQueue(LinkQueue<DT> &Q,DT &e)
{
QNode<DT> *p;
if(Q.front==Q.rear) return false; //队空返回false
p=Q.front->next; // 取出队元素
e=p->data;
Q.front->next=p->next; //队首元素出队
if(Q.rear==p) //只有一个元素时出队,
Q.rear=Q.front; // 修改队尾
delete p;
return true; // 出队成功返回true
}
//【算法3.23】 取队头元素
template<class DT>
bool GetHead(LinkQueue<DT> Q,DT &e)
{
if(Q.front==Q.rear) return false; // 队空返回false
e=Q.front->next->data;
return true; // 删除成功返回true
}
//取队尾元素
template<class DT>
bool GetTail(LinkQueue<DT> Q,DT &e)
{
if(Q.front==Q.rear) // 队空
return false; // 返回false
e=Q.rear->data; // 获取队尾元素
return true; // 返回true
}
//测队空
template<class DT>
bool QueueEmpty(LinkQueue<DT> Q)
{
if(Q.front==Q.rear) // 队空
return true; //返回true
else //非空
return false; //返回false
}
//显示队列内容
template<class DT>
void DispQueue(LinkQueue<DT> Q)
{
QNode<DT> *p;
p=Q.front->next;
while(p)
{
cout<<p->data<<"\t";
p=p->next;
}
cout<<endl;
}

View File

@@ -0,0 +1,93 @@
#include<iostream> //cout,cin
using namespace std;
#include "LinkStack.h"
void dispmenu()
{//显示主菜单
cout<<endl;
cout<<"1-初始化链栈\n";
cout<<"2-元素入栈\n";
cout<<"3-元素出栈\n";
cout<<"4-取栈顶元素\n";
cout<<"5-清空栈\n";
cout<<"6-测栈空\n";
cout<<"7-显示栈元素\n";
cout<<"0-退出\n";
}
//主函数
int main()
{
int e;
SNode<int> * S;
system("cls"); // 清屏
int choice;
do
{
dispmenu(); //显示主菜单
cout<<"Enter choice(1~60 退出):";
cin>>choice;
switch(choice)
{
case 1: //初始化链栈
InitStack(S);
cout<<endl<<"创建成功!"<<endl;
break;
case 2: //入栈
cout<<"输入要入栈的元素值:"<<endl;
cin>>e;
cout<<endl;
if(Push(S,e))
{
cout<<endl<<"入栈成功!栈中元素为:"<<endl;
DispStack(S);
}
else
cout<<endl<<"入栈不成功!"<<endl;
break;
case 3: //出栈
if(Pop(S,e))
{
cout<<endl<<"出栈成功!出栈元素为:"<<e<<endl;
cout<<"出栈后,栈中元素为"<<endl;
DispStack(S);
}
else
cout<<endl<<"栈空,出栈失败!"<<endl;
break;
case 4: //获取栈顶元素
if(GetTop(S,e))
{
cout<<endl<<"栈顶元素为:"<<e<<endl;
}
else
cout<<endl<<"栈空!"<<endl;
break;
case 5: // 清空栈
DestroyStack(S);
cout<<"栈已清空!"<<endl;
break;
case 6: //测栈空
if(StackEmpty(S))
cout<<endl<<"空栈!"<<endl;
else
cout<<endl<<"不是空栈!"<<endl;
break;
case 7: //显示栈元素
DispStack(S);
cout<<endl;
break;
case 0: //退出
DestroyStack(S);
cout<<"结束运行Bye-bye!"<<endl;
break;
default: //非法选择
cout<<"无效选择!\n";
break;
}
}while(choice!=0);
return 0;
}//end of main function

View File

@@ -0,0 +1,96 @@
template <class DT>
struct SNode // 结点
{
DT data; // 数据域,存储数据元素值
SNode *next; // 指针域,指向下一个结点
};
//【算法3.6】
template <class DT>
bool InitStack(SNode<DT> *&S) // 创建空链栈
{
S=NULL;
return true;
}
//【算法3.7】
template <class DT>
void DestroyStack(SNode<DT> *(&S)) // 释放链栈所占内存
{
SNode<DT> *p;
while(S) //从头结点开始,依次释放结点
{
p=S;
S=S->next;
delete p;
}
S=NULL;
}
//【算法3.8】
template<class DT>
bool Push(SNode<DT> *&S,DT e)
{
SNode<DT> *p;
p=new SNode<DT>;
if(!p)
return false; //创建失败,结束运行
p->data=e; // 新结点赋值
p->next=S; //结点S链接到p结点之后
S=p;
return true; // 插入成功返回true
}
//【算法3.9】
template<class DT>
bool Pop(SNode<DT> *&S,DT &e)
{
SNode<DT> *p;
if(S==NULL) return false;
p=S;
e=p->data;
S=S->next;
delete p;
return true; // 删除成功返回true
}
//【算法3.10】
template<class DT>
bool GetTop(SNode<DT> *S,DT &e)
{
SNode<DT> *p;
if(S==NULL) return false;
p=S;
e=p->data;
return true; // 删除成功返回true
}
//测栈空
template<class DT>
bool StackEmpty(SNode<DT> *S)
{
if(S==NULL)
return true;
else
return false;
}
//显示栈内容
template<class DT>
void DispStack(SNode<DT> *S)
{
SNode<DT> *p;
p=S;
while(p)
{
cout<<p->data<<"\t";
p=p->next;
}
cout<<endl;
}

View File

@@ -0,0 +1,126 @@
#include<iostream>//cout,cin
using namespace std;
#include "SqQueue.h"
char pause;
void dispmenu() //菜单
{
cout<<endl;
cout<<"1-初始化顺序队列\n";
cout<<"2-元素入队\n";
cout<<"3-元素出队\n";
cout<<"4-取队头元素\n";
cout<<"5-取队尾元素\n";
cout<<"6-清空队\n";
cout<<"7-测队空\n";
cout<<"8-测队满\n";
cout<<"9-显示队列元素\n";
cout<<"10-显示队头、队尾指针\n";
cout<<"0-退出\n";
}
//主函数
int main()
{
int i;
int e;
SqQueue<int> Q; // 元素类型为整型的顺序队列
system("cls"); // 清屏
int choice;
do
{
dispmenu(); //显示主菜单
cout<<"功能选择(1~100 退出!):";
cin>>choice;
switch(choice)
{
case 1: // 初始化顺序队列
cout<<"请输入要创建的顺序队列的长度";
cin>>i;
cout<<endl;
InitQueue (Q,i);
cout<<endl<<"创建成功!"<<endl;
break;
case 2: // 入队
cout<<"输入要入队的元素值:"<<endl;
cin>>e;
cout<<endl;
if(EnQueue(Q,e))
{
cout<<endl<<"入队成功!入队后队列元素为:"<<endl;
DispQueue(Q);
}
else
cout<<endl<<"队满,不能入队!"<<endl;
break;
case 3: // 出队
if(DeQueue(Q,e))
{
cout<<endl<<"队列元素为:";
DispQueue(Q);
cout<<endl<<"出队元素为:"<<e<<endl;
}
else
cout<<endl<<"队空,不能出队!"<<endl;
break;
case 4: // 取队头元素
if(GetHead(Q,e))
{
cout<<endl<<"队列元素为:";
DispQueue(Q);
cout<<endl<<"队头元素为:"<<e<<endl;
}
else
cout<<endl<<"队空!"<<endl;
break;
case 5: // 取队尾元素
if(GetTail(Q,e))
{
cout<<endl<<"队列元素为:";
DispQueue(Q);
cout<<endl<<"队尾元素为:"<<e<<endl;
}
else
cout<<endl<<"队空!无数据元素"<<endl;
break;
case 6: // 清空队
ClearQueue(Q);
cout<<"队已清空!"<<endl;
break;
case 7: // 测队空
if(QueueEmpty(Q))
cout<<endl<<"空队!"<<endl;
else
cout<<endl<<"非空队!"<<endl;
break;
case 8: // 测队满
if(QueueFull(Q))
cout<<endl<<"满队!"<<endl;
else
cout<<endl<<"非满队!"<<endl;
break;
case 9: // 显示队列元素
DispQueue(Q);
cout<<endl;
break;
case 10:
cout<<"\nQ.fornt="<<Q.front<<endl;
cout<<"Q.rear="<<Q.rear<<endl;
break;
case 0: // 退出
DestroyQueue(Q);
cout<<"结束运行Bye-bye!"<<endl;
break;
default: // 无效选择
cout<<"无效选择!\n";
break;
}
}while(choice!=0);
return 0;
}//end of main function

View File

@@ -0,0 +1,113 @@
#include<iostream>//cout,cin
using namespace std;
#include "SqStack.h"
char pause;
void dispmenu()
{ //显示主菜单
cout<<endl;
cout<<"1-初始化顺序栈\n";
cout<<"2-元素入栈\n";
cout<<"3-元素出栈\n";
cout<<"4-取栈顶元素\n";
cout<<"5-清空栈\n";
cout<<"6-测栈空\n";
cout<<"7-测栈满\n";
cout<<"8-显示栈元素\n";
cout<<"9-查看栈顶指针\n";
cout<<"0-退出\n";
}
//主函数
int main()
{
int i;
int e;
SqStack<int> S;//建立容量为20、元素类型为整型的空顺序栈
system("cls"); // 清屏
int choice;
do
{
dispmenu(); // 显示主菜单
cout<<"Enter choice(1~60 退出):";
cin>>choice;
switch(choice)
{
case 1: // 初始化顺序栈
cout<<"请输入要创建的顺序栈的长度";
cin>>i;
cout<<endl;
InitStack (S,i);
cout<<endl<<"创建成功!"<<endl;
break;
case 2: // 入栈
cout<<"输入要入栈的元素值:"<<endl;
cin>>e;
if(Push(S,e))
{
cout<<"入栈成功!入栈后栈元素为:"<<endl;
DispStack(S);
}
else
cout<<endl<<"栈满,不能入栈!"<<endl;
break;
case 3: // 出栈
if(Pop(S,e))
{
cout<<"出栈成功!出栈元素为:"<<e<<endl;
cout<<"出栈后栈元素为:"<<endl;
DispStack(S);
}
else
cout<<endl<<"栈空,出栈失败!"<<endl;
break;
case 4: // 取栈顶元素
if(GetTop(S,e))
{
cout<<endl<<"栈顶元素为:"<<e<<endl;
}
else
cout<<endl<<"栈空!"<<endl;
break;
case 5: // 清空栈
ClearStack(S);
cout<<endl<<"栈已空!"<<endl;
break;
case 6: // 测栈空
if(StackEmpty(S))
cout<<endl<<"空栈!"<<endl;
else
cout<<endl<<"不是空栈!"<<endl;
break;
case 7: // 测栈满
if(StackFull(S))
cout<<endl<<"栈满!"<<endl;
else
cout<<endl<<"栈不满!"<<endl;
break;
case 8: // 显示栈元素
DispStack(S);
cout<<endl;
break;
case 9: // 显示栈顶指针
cout<<"栈顶指针top= "<<S.top<<endl;
cout<<endl;
break;
case 0: // 退出
DestroyStack(S);
cout<<"结束运行 Bye-bye!"<<endl;
break;
default: // 无效选择
cout<<"无效选择!\n";
break;
}
}while(choice!=0);
return 0;
}//end of main function

View File

@@ -0,0 +1,107 @@
template <class DT>
struct SqStack // 顺序栈
{
DT *base; // 栈首址
int top; // 栈顶指针
int stacksize; // 栈容量
};
//基本操作的实现
//【算法3.1】 // 初始化栈
template <class DT>
void InitStack(SqStack<DT> &S, int m)
{
S.base=new DT[m]; // 申请栈空间
if(S.base==NULL) // 申请失败,退出
{
cout<<"未创建成功!";
exit (1);
}
S.top=-1; // 设置空栈属性
S.stacksize=m;
}
//算法3.2】 // 销毁栈
template <class DT>
void DestroyStack(SqStack<DT> &S)
{
delete [] S.base; // 释放栈空间
S.top=-1;
S.stacksize=0; // 设置栈属性
}
//【算法3.3】 // 入栈
template<class DT>
bool Push(SqStack<DT> &S,DT e)
{
if(S.top==S.stacksize-1) // 栈满,不能入栈
return false; // 返回false
S.top++;
S.base[S.top]=e;
return true; // 入栈成功返回true
}
//【算法3.4】 // 出栈
template<class DT>
bool Pop(SqStack<DT> &S,DT &e)
{
if(S.top==-1) // 栈空
return false; // 返回false
e=S.base[S.top]; // 取栈顶元素
S.top--; // 栈顶指针下移
return true; // 出栈成功返回true
}
//【算法3.5】 // 获取栈顶元素
template<class DT>
bool GetTop(SqStack<DT> S,DT &e)
{
if(S.top==-1) // 栈空
return false; // 返回false
e=S.base[S.top]; // 栈非空,取栈顶元素
return true; // 返回true
}
// 测栈空
template<class DT>
bool StackEmpty(SqStack<DT> S)
{
if(S.top==-1) // 空栈返回true
return true;
else // 空栈返回false
return false;
}
//显示栈内容
template<class DT>
void DispStack(SqStack<DT> S)
{
int i=S.top;
while(i>=0)
{
cout<<S.base[i--]<<"\t";
}
cout<<endl;
}
template<class DT>
void ClearStack(SqStack<DT> &S)
{
S.top=-1;
}
template<class DT>
int StackFull(SqStack<DT> S)
{
if(S.top==S.stacksize-1)
return 1;
else
return 0;
}

View File

@@ -0,0 +1,282 @@
#include<iostream> //cout,cin
using namespace std;
#include"SqStack.h"
char pause;
char Precede(char t1,char t2) //算符的优先级比较
{
char f;
switch(t2)
{
case '+':
case '-':if(t1=='('||t1=='=')
f='<';
else
f='>';
break;
case '*':
case '/':if(t1=='*'||t1=='/'||t1==')')
f='>';
else
f='<';
break;
case '(':if(t1==')')
{
cout<<"ERROR1"<<endl;
exit(0);
}
else
f='<';
break;
case ')':switch(t1)
{
case '(':f='=';
break;
case '=':cout<<"ERROR2"<<endl;
exit(0);
default: f='>';
}
break;
case '=':switch(t1)
{
case '=':f='=';
break;
case '(':cout<<"ERROR2"<<endl;
exit(0);
default: f='>';
}
}
return f;
}
bool In(char ch) // 判断 ch 是否为运算符
{
switch(ch)
{
case'+':
case'-':
case'*':
case'/':
case'(':
case')':
case'=':return true;
default:return false;
}
}
float Operate(float a,char theta,float b)
{ // 实施一次运算
float ch;
switch(theta)
{
case'+':ch=a+b;
break;
case'-':ch=a-b;
break;
case'*':ch=a*b;
break;
case'/':ch=a/b;
}
return ch;
}
//算法3.12
float Val_Exp(char *exp) // 中缀表达式求值。
{
SqStack<char> OP; // 运算符栈
SqStack<float> OD; // 运算数栈
InitStack(OP,30);
InitStack(OD,30);
char theta;
float a,b,result;
char ch,x; // 存放由键盘接收的字符
char z[6]; // 存放符点数字符串
int i;
Push(OP,'='); // # 是表达式结束标志
ch=*exp++;
GetTop(OP,x);
while(ch!='='||x!='=')
{
if(ch>='0'&&ch<='9'||ch=='.') // ch 是操作数
{
i=0;
do
{
z[i]=ch;
i++;
ch=*exp++;
} while(ch>='0'&&ch<='9'||ch=='.');
z[i]='\0';
result=atof(z); // 将字符串数组转为符点型存于result
Push(OD,result);
}
else if(In(ch)) // 是7种运算符之一
switch(Precede(x,ch))
{
case'<':Push(OP,ch); // 栈顶元素优先权低
ch=*exp++;
break;
case'=':Pop(OP,x); // 脱括号并接收下一字符
ch=*exp++;
break;
case'>':Pop(OP,theta); // 退栈并将运算结果入栈
Pop(OD,b);
Pop(OD,a);
Push(OD,Operate(a,theta,b));
}
else // ch是非法字符
{
cout<<"ERROR3"<<endl;;
exit(0);
}
GetTop(OP,x);
}
GetTop(OD,result);
DestroyStack(OP);
DestroyStack(OD);
return result;
}
void CreatePostExp(char * exp,char * &postexp) // 由中缀式求后缀式
{
char ch,x;
int i=0;
SqStack<char> OP;
InitStack(OP,30);
Push(OP,'='); // # 是表达式结束标志
cout<<"中缀表达式:"<<exp<<endl;
ch=*exp++;
while(ch)
{
if((ch>='0'&&ch<='9')||ch=='.')
{
postexp[i++]=ch;
ch=*exp++;
}
if(In(ch)) // 是7种运算符之一
{
postexp[i++]=' ';
GetTop(OP,x);
switch(Precede(x,ch))
{
case'<':Push(OP,ch); // 栈顶元素优先权低
ch=*exp++;
break;
case'=':Pop(OP,x); // 脱括号并接收下一字符
ch=*exp++;
break;
case'>':
Pop(OP,postexp[i++]); // 运算符出栈输出
break;
}
}
postexp[i]='\0';
}//while
cout<<"\n后缀表达式为:"<<postexp<<endl;
DestroyStack(OP);
}
//算法3.13
float Val_PostExp(char *postexp) // 后缀表达式求值
{
int i;
char z[6];
float result=0,d=0,a,b;
char ch;
SqStack<float> OD;
InitStack(OD,30);
ch=*postexp++;
while(ch!='\0')
{
if(ch>='0'&&ch<='9'||ch=='.') // ch为操作数符号
{
i=0;
do
{
z[i++]=ch;
ch=*postexp++; // 取下一个操作数符号
} while(ch>='0'&&ch<='9'||ch=='.');
z[i]='\0';
d=atof(z); // 将字符串数组转为符点型存于result
Push(OD,d); // 操作数进栈
}
if(In(ch)) // ch为运算符
{
Pop (OD,a);
Pop (OD,b);
Push (OD,Operate(b,ch,a));
ch=*postexp++;
}
ch=*postexp++;
}
Pop (OD,result);
DestroyStack(OD);
return result;
}
//主函数
void main()
{
//int i;
char exp[20]="(2.2+5)+4*(5-3.1)=";
char *postexp;
postexp=new char[30];
*postexp='\0';
float v;
system("cls"); // 清屏
cout<<"\n缺省表达式:"<<exp;
cout<<endl;
int choice;
do
{ // 显示主菜单
cout<<endl;
cout<<"1-创建表达式\n";
cout<<"2-表达式求值\n";
cout<<"3-求后缀表达式\n";
cout<<"4-后缀表达式求值\n";
cout<<"5-显示表达式\n";
cout<<"0-退出\n";
cout<<"输入功能选项1~50 退出):\n";
cin>>choice;
switch(choice)
{
case 1: // 创建表达式
cout<<"\n请输入表达式,以=结束"<<endl;
cin>>exp;
break;
case 2: // 表达式求值
v=Val_Exp(exp) ;
cout<<exp;
cout<<v<<endl;
break;
case 3: // 求后缀表达式
CreatePostExp(exp,postexp);
break;
case 4: // 后缀表达式求值
v=Val_PostExp(postexp);
cout<<'\n'<<postexp<<"="<<v<<endl;
break;
case 5: // 显示表达式
cout<<endl;
cout<<"\n已创建的表达式为:";
cout<<exp<<endl;
if(strlen(postexp))
{
cout<<"\n后缀表达式为:";
cout<<postexp<<endl;
}
break;
case 0: // 退出
cout<<"\n结束运行Bye-Bye!"<<endl;
break;
default://
cout<<"\n无效选择!\n";
break;
}
}while(choice!=0);
}//end main

View File

@@ -0,0 +1,89 @@
template <class DT>
struct SqStack // 顺序栈
{
DT *base; // 栈首址
int top; // 栈顶指针
int stacksize; // 栈容量
};
//基本操作的实现
//【算法3.1】 // 初始化栈
template <class DT>
void InitStack(SqStack<DT> &S, int m)
{
S.base=new DT[m]; // 申请栈空间
if(S.base==NULL) // 申请失败,退出
{
cout<<"未创建成功!";
exit (1);
}
S.top=-1; // 设置空栈属性
S.stacksize=m;
}
//算法3.2】 // 销毁栈
template <class DT>
void DestroyStack(SqStack<DT> &S)
{
delete [] S.base; // 释放栈空间
S.top=-1;
S.stacksize=0; // 设置栈属性
}
//【算法3.3】 // 入栈
template<class DT>
bool Push(SqStack<DT> &S,DT e)
{
if(S.top==S.stacksize-1) // 栈满,不能入栈
return false; // 返回false
S.top++;
S.base[S.top]=e;
return true; // 入栈成功返回true
}
//【算法3.4】 // 出栈
template<class DT>
bool Pop(SqStack<DT> &S,DT &e)
{
if(S.top==-1) // 栈空
return false; // 返回false
e=S.base[S.top]; // 取栈顶元素
S.top--; // 栈顶指针下移
return true; // 出栈成功返回true
}
//【算法3.5】 // 获取栈顶元素
template<class DT>
bool GetTop(SqStack<DT> S,DT &e)
{
if(S.top==-1) // 栈空
return false; // 返回false
e=S.base[S.top]; // 栈非空,取栈顶元素
return true; // 返回true
}
// 测栈空
template<class DT>
bool StackEmpty(SqStack<DT> S)
{
if(S.top==-1) // 空栈返回true
return true;
else // 空栈返回false
return false;
}
//显示栈内容
template<class DT>
void DispStack(SqStack<DT> S)
{
int i=S.top;
while(i>=0)
{
cout<<S.base[i--]<<"\t";
}
cout<<endl;
}