#include <iostream.h>
#include <windows.h>
#include <string>
#include<fstream>
using namespace std;
class Stack;//类Stack的声明
/*
定义一个链栈结点类Stacknode
*/
class Stacknode
{
friend class Stack;//申请友元类
private:
Stacknode(Stacknode *nextp=NULL);//构造函数
Stacknode(char &newdata,Stacknode *nextp=NULL);//构造函数
int data;//数据元素
Stacknode *next;//递归定义指向后继结点的指针
};
/*
Stacknode的实现部分
*/
Stacknode::Stacknode(Stacknode *nextp)//构造函数
{
next=nextp;
}
Stacknode::Stacknode(char &newdata,Stacknode *nextp)//构造函数
{
data=newdata;
next=nextp;
}
//结点类Stacknode的定义结束
/*
定义一个链栈类Stack
*/
class Stack
{
public:
Stack();//创建一个空栈
~Stack();//回收一个栈
void clear();//销毁一个栈
bool empty() const;//确定栈是否已空
bool push(char &item);//把数据压进栈
bool pop();//出栈
bool pop(char &item);//把数据弹出栈,返回
bool top(char &item) const;//取出栈顶元素
private:
Stacknode *newnode(Stacknode *nextp=NULL);
Stacknode *newnode(char &item,Stacknode *nextp=NULL);//创建新的结点
Stacknode *Stacktop;
int Stacklength;
};
/*
Stack的实现部分
*/
Stacknode *Stack::newnode(Stacknode *nextp)//创建新的结点,不带数据
{
return new Stacknode(nextp);
}
Stacknode *Stack::newnode(char &item,Stacknode *nextp)//创建新的结点,数据域赋值
{
return new Stacknode(item,nextp);
}
//以下为栈类Stack的函数定义
Stack::Stack()//创建一个空栈
{
Stacktop=newnode();//创建一个栈顶指针初始化,相当于Stacktop=NULL;本链表没有用头结点
Stacklength=0;
}
Stack::~Stack()//回收一个栈
{
clear();
delete Stacktop;//释放栈底
}
void Stack::clear()//销毁一个栈
{
while(pop());//不停地出栈,而每次释放空间在出栈函数中完成
}
bool Stack::empty() const//确定栈是否已空
{
return Stacklength<=0?true:false;
}
bool Stack::push(char &item)//数据进栈
{
Stacknode *newnodep;//定义指针newnodep,准备指向申请的新结点
newnodep=newnode(item,Stacktop);//申请新结点,把数据存入,把指针域指向头指针
if(!newnodep)//如果没有申请到空间,返回失败
return false;
Stacktop=newnodep;//改链,完成进栈
Stacklength++;//栈的长度增加
return true;//本次操作成功
}
bool Stack::pop()//出栈,不要栈顶数据
{
Stacknode *usednodep;//定义指针usednodep,准备指向出栈的结点
if(!empty())//判断是否栈空
{
usednodep=Stacktop;//指向出栈的结点
Stacktop=Stacktop->next;//栈顶指针后移
delete usednodep;//释放空间
Stacklength--;//栈的长度减少
return true;//本次操作成功
}
return false;//否则本次操作失败
}
bool Stack::pop(char &item)//出栈,把栈顶数据弹返回去
{
Stacknode *usednodep;//定义指针usednodep,准备指向出栈的结点
if(!empty())//判断是否栈空
{
usednodep=Stacktop;//指向出栈的结点
Stacktop=Stacktop->next;//栈顶指针后移
item=usednodep->data;//把数据保留下来,返回去
delete usednodep;//释放空间
Stacklength--;//栈的长度减少
return true;//本次操作成功
}
return false;//否则本次操作失败
}
bool Stack::top(char &item) const//取出栈顶数据返回去
{
if(!empty())//如果栈不空,记录当前栈顶元素
{
item=Stacktop->data;//通过item返回去
return true;//本次操作成功
}
return false;//否则本次操作失败
}
/*
定义一个功能类SymbolMatching
*/
class SymbolMatching
{
private:
Stack *stack;
public:
SymbolMatching();//构造函数
~SymbolMatching();//析构函数
bool manualinputdatabase(char *database);//人工输入数据信息
bool fileguidedatabase(char *filename);//文件导入数据信息
};
SymbolMatching::SymbolMatching()//构造函数
{
stack=new Stack;
}
SymbolMatching::~SymbolMatching()//析构函数
{
delete stack;
}
bool SymbolMatching::manualinputdatabase(char *database)//人工输入数据信息
{
int i=0;
char match,symbol;
bool is_match=true;
while(database[i]!='\0'&&is_match)
{
symbol=database[i++];
if(symbol=='('||symbol=='{'||symbol=='[')
stack->push(symbol);//入栈
else if(symbol==')'||symbol=='}'||symbol==']')
{
if(stack->empty())
{
if(database[i+1]!='\0')
cout<<"右边符号多于左边符号!"<<endl;
else
cout<<"符号"<<symbol<<"无法找到与之匹配的符号!"<<endl;
is_match=false;
}
else
{
stack->top(match);
stack->pop();//出栈
is_match=(symbol==')'&&match=='('||symbol==']'&&match=='['||symbol=='}'&&match=='{');
if(!is_match)
cout<<"符号"<<match<<"和"<<symbol<<"不匹配!"<<endl;
}
}
}
if(is_match)
{
if(!stack->empty())//栈不为空
{
cout<<"左边符号多于右边符号!"<<endl;
is_match=false;
}
else
cout<<"左右符号匹配次序正确!"<<endl;
}
stack->clear();
return is_match;
}
bool SymbolMatching::fileguidedatabase(char *filename)//文件导入数据信息
{
int i=0;
char match,symbol;
bool is_match=true;
while(filename[i]!='\0'&&is_match)
{
symbol=filename[i++];
if(symbol=='('||symbol=='{'||symbol=='[')
stack->push(symbol);//入栈
else if(symbol==')'||symbol=='}'||symbol==']')
{
if(stack->empty())
{
if(filename[i+1]!='\0')
cout<<"右边符号多于左边符号!"<<endl;
else
cout<<"符号"<<symbol<<"无法找到与之匹配的符号!"<<endl;
is_match=false;
}
else
{
stack->top(match);
stack->pop();//出栈
is_match=(symbol==')'&&match=='('||symbol==']'&&match=='['||symbol=='}'&&match=='{');
if(!is_match)
cout<<"符号"<<match<<"和"<<symbol<<"不匹配!"<<endl;
}
}
}
if(is_match)
{
if(!stack->empty())//栈不为空
{
cout<<"左边符号多于右边符号!"<<endl;
is_match=false;
}
else
cout<<"左右符号匹配次序正确!"<<endl;
}
stack->clear();
return is_match;
}
/*
定义一个实现链栈功能的菜单处理类interfacebase
*/
class interfacebase
{
private:
SymbolMatching SymbolMatchingonface;
public:
void clearscreen(void);//清屏
void showmenu(void);//显示菜单函数
int userchoice(void);//用户的选项
void processmenu(int menuchoice);//菜单函数
};
/*
interfacebase类的实现部分
*/
void interfacebase::clearscreen(void)
{
system("cls");
}
void interfacebase::showmenu(void)
{
cout<<"链式堆栈实现括号匹配判断的功能菜单"<<endl;
cout<<"=================================="<<endl;
cout<<"1.人工输入数据信息"<<endl;
cout<<"2.文件导入数据信息"<<endl;
cout<<"0.退出"<<endl;
cout<<"=================================="<<endl;
}
int interfacebase::userchoice(void)
{
int menuchoice;
cout<<"请输入您的选择:";
cin>>menuchoice;
return menuchoice;
}
void interfacebase::processmenu(int menuchoice)
{
switch(menuchoice)//根据用户的选择进行相应的操作
{
case 1:
{
string str;
char temp;
cout<<"输入字符串,按回车键结束输入:"<<endl;
while((temp=cin.get())!='\n')
{
str +=temp;
}
const int LEN =str.length();
char* database = new char[LEN];//根据输入字符串的长度,创建字符数组
for(int i = 0;i<LEN;i++) //将字符串保存到字符数组中
{
database[i]=str[i];
}
SymbolMatchingonface.manualinputdatabase(database);
delete database;
}
break;
case 2:
{
ifstream in("data.txt");
char data,j,*filename=new char[100];
int num=0;
while(!in.eof())
{
in>>data;
filename[num]=data;
cout<<filename[num];
num++;
}
cout<<endl;
SymbolMatchingonface.fileguidedatabase(filename);
delete filename;
}
break;
case 0:
exit(0);
default:
cout<<"对不起,您输入的功能编号有错!请重新输入!!!"<<endl;
break;
}
}
/*
程序主入口
*/
void main(void)
{
int menuchoice;//定义变量,菜单选单项的选择
interfacebase interfacebasenow;
system("color f0");//修改屏幕的背景色和字的颜色
interfacebasenow.clearscreen();//清屏
while(1)//永真循环
{
interfacebasenow.showmenu();//显示菜单
menuchoice=interfacebasenow.userchoice();//获取用户的选择
interfacebasenow.processmenu(menuchoice);//处理用户的选择
system("pause");
interfacebasenow.clearscreen();//清屏
}
}//主函数结束
为什么键盘输入字符串和文件导入字符串都有错?错误应该怎么改?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- Rotch 2019-08-06 11:41关注
第一个
While(1) { char tmp = cin.get(); if (tmp == '\r' /*Aka '\n'*/) { break; } else { str += tmp; } }
第二个
如果你要获取整个TXT内的所有内容,可以这样:string str, tmp; while (getline(in, tmp) { str += tmp; }
如果不行的话再问吧,我也不太搞控制台这边,但希望采纳一下,谢谢!
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 C语言PE文件遍历节表
- ¥15 求C# .net4.8小报表工具
- ¥15 安装虚拟机时出现问题
- ¥15 Selenium+docker Chrome不能运行
- ¥15 mac电脑,安装charles后无法正常抓包
- ¥18 visio打开文件一直显示文件未找到
- ¥15 请教一下,openwrt如何让同一usb储存设备拔插后设备符号不变?
- ¥50 使用quartz框架进行分布式任务定时调度,启动了两个实例,但是只有一个实例参与调度,另外一个实例没有参与调度,不知道是为什么?请各位帮助看一下原因!!
- ¥50 怎么获取Ace Editor中的python代码后怎么调用Skulpt执行代码
- ¥30 fpga基于dds生成幅值相位频率和波形可调的容易信号发生器。