一天看到了这么一个文件:
/* file1.txt */
[00:06.32]曾 曾经在我眼前 却又消失不见
[00:14.68]这是今天的第六遍
[00:20.99]电影里的配乐 好像你的双眼
[00:27.55]我爱你 快回到 我身边
[00:41.76].....
于是花了一个晚上,从构思到实现,把去括号的方法解决了,以下就是结合栈实现的去括号内容(包括括号本身)的程序
//============================================================================
// Name : TEST.cpp
// Author : 陆键霏
// College : 深圳职业技术学院
// Copyright : Your copyright notice
// Description : KillBrackets
//============================================================================
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
typedef char datatype;/*elemptype为元素类型*/
typedef struct node
{
datatype data;
struct node* next;
}Node; /*该链表结构*/
class STACK
{
private:
Node *top;
public:
STACK();
void setnull();
int empty(); //判断该栈是否为空
void push(datatype x); //入栈
bool pop(datatype *x1); //出栈
datatype gettop(); //获得栈顶元素
void print(); //输出栈元素
};
STACK::STACK()
{
top=NULL;
}
void STACK::setnull()
{
Node *p;
do
{
p=top;
top=top->next;
delete p;
}while(top!=NULL);
}
int STACK::empty() //小于零说明该栈为空
{
if(top==NULL)
return true;
else
return false;
}
void STACK::push(datatype x) //入栈
{
Node *p;
p=new Node;
p->data=x;
p->next=top;
top=p;
}
bool STACK::pop(datatype *x) //出栈
{
Node *p;
if(top==NULL)
{
cout<<"栈空";
return false;
}
else
{
p=top;
*x=p->data;
top=top->next;
delete p;
return true;
}
}
datatype STACK::gettop()
{
return top->data;
}
class killSquareBrackets
{
private:
STACK s;
string str;
public:
killSquareBrackets();
killSquareBrackets(string str);
void setString(string str);
void printResult();
string getObjectString();
};
killSquareBrackets::killSquareBrackets(){}
killSquareBrackets::killSquareBrackets(string str)
{
this->str=str+'#';
}
void killSquareBrackets::setString(string str)
{
this->str=str+'#';
}
void killSquareBrackets::printResult()
{
char char1,char2;
int i=0;
char2=this->str[i];
while(char2!='#')
{
if(char2!='[' &&
char2!=']' )
{
s.push(char2);
char2=this->str[++i];
}
else
if(char2=='[')
{
s.push(char2);
char2=this->str[++i];
}
else
if(char2==']')
{
s.pop(&char1);
while(char1!='[')
{
s.pop(&char1);
}
char2=this->str[++i];
}
}
STACK temp;
//反向处理
while(!s.empty())
{
s.pop(&char1);
temp.push(char1);
}
while(!temp.empty())
{
temp.pop(&char1);
cout<<char1;
}
}
string killSquareBrackets::getObjectString(){
char char1,char2;
int i=0;
char2=this->str[i];
while(char2!='#')
{
if(char2!='[' &&
char2!=']' )
{
s.push(char2);
char2=this->str[++i];
}
else
if(char2=='[')
{
s.push(char2);
char2=this->str[++i];
}
else
if(char2==']')
{
s.pop(&char1);
while(char1!='[')
{
s.pop(&char1);
}
char2=this->str[++i];
}
}
STACK temp;
//反向处理
while(!s.empty())
{
s.pop(&char1);
temp.push(char1);
}
char tempStr[str.length()];
i=0;
while(!temp.empty())
{
temp.pop(&char1);
tempStr[i]=char1;
i++;
}
int j=0;
for(j=i;j<str.length()-1;j++)
{
tempStr[j]=0x20;
}
tempStr[j]='/0'; //关键 每一句后加上结束符
// char returnStr[i+1];
// for(int j=0;j<=i;i++)
// {
// returnStr[j]=tempStr[j];
// }
return tempStr;
}
int main(int argc,char *args[]) {
ifstream infile(args[1]);
ofstream outfile(args[2],ios::trunc);
if(argc!=3)
{
cerr<<"/nkillBrackets [drive:][path]<source filename>"<<endl;
cerr<<" [drive:][path]<destination filename> /n";
}
if(!infile)
{
return 0;
}
if(!outfile)
{
return 0;
}
//Reads the original file
killSquareBrackets mystr;
char str[100];
while(!infile.eof())
{
infile.getline(str,sizeof(str));
mystr.setString(str);
outfile<<mystr.getObjectString();
outfile<<endl;
}
//outfile<<'/0';
//Writes the object file
infile.close();
outfile.close();
return 0;
}
//
将以上程序编译链接成exe文件,在dos下调用,
比如:
将文件命名为 KillBrackets.exe
dos下调用
C:/Documents and Settings/John>KillBrackets file1 file2
注释:file1和file2分别代表输出的源文件和目标文件。
源文件:
[00:06.32]曾 曾经在我眼前 却又消失不见
[00:14.68]这是今天的第六遍
[00:20.99]电影里的配乐 好像你的双眼
[00:27.55]我爱你 快回到 我身边
[00:41.76].....
目标文件:
曾 曾经在我眼前 却又消失不见
这是今天的第六遍
电影里的配乐 好像你的双眼
我爱你 快回到 我身边
好不好 好不好 好不好
相信一定很实用!!
04-10
168
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
04-08
121
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)