数据结构——零基础建栈
代码讲解
结构体
结构体:可以将多种数据类型组合组合起来的结构,可以避免变量的反复声明,声明方式如下,值得注意的是结构体也是种数据类型,可在另一结构体中定义。
struct 结构体名称{
成员1的类型 成员1的名称
成员2的类型 成员2的名称
.........
成员3的类型 成员3的名称
}
举例:
struct time{
int hour;
int minute;
int second;
}time 1,time 2;//声明的同时定义
//结构体外定义用struct time time1;
//赋值时struct student alan={01,"Alan","男",16};
//和数组初始化一样
给一个char字符数组赋值用strcpy(alan.name,“Alan”);
" t y p e i n t + type\,\, int+ typeint+别名"的作用
用typedef来为类型起个别名,如“typedef long INDEX;”。给long这样的类型起别名主要目的不是简化程序的书写,它有两个用处:一是表明该类型的特殊作用,二是将来有可能要改变这种类型(比如提高精度),如果直接声明为long型则失去了程序的可惟护性——每一个变量的声明都要改动;而声明为INDEX则使维护程序变得十分简单——只要改一下typedef语句即可。
比如
t y p e d e f i n t d a t e t y p e typedef \, \,int\,\, datetype typedefintdatetype
然后下面有N个函数,都是类似这样的:
datetype typeadd(datetype a, datetype b)
{
return a + b;
}
datetype typediff(datetype a, datetype b)
{
return a - b;
}
datetype func1(datetype a, datetype b) {
datetype tmp;
tmp = typeadd(typediff(a,b), typediff(a,b));
return typeadd(tmp, tmp);
}
如果你没用 d a t e t y p e datetype datetype而是直接用的 i n t int int,当你希望这些函数计算浮点数的时候,你就必须把所有代码里的所有 i n t int int都换成 f l o a t float float或者 d o u b l e double double,而且一旦有地方换漏了就很容易出错,丢失精度什么的
C++ 文件操作fstream
C语言里面对文件的操作是通过文件指针,以及一些相关的函数,那么C++中是如何对文件进行操作的呢?没错,就是通过 fstream 这个文件流来实现的。当我们使用#include 时,我们就可以使用其中的 ifstream,ofstream以及fstream 类(ofstream是从内存到硬盘,ifstream是从硬盘到内存),也就可以用这三个类来定义相应的对象了,这三个类分别代表一个输入文件,一个输出文件,以及一个输入输出文件。Ifstream类支持>>操作符,ofstream类支持<<操作符,fstream类同时支持>>和<<操作符。
1.直接使用流对象进行文件的操作,默认方式如下:
ofstream out("...", ios::out);
ifstream in("...", ios::in);
fstream foi("...", ios::in|ios::out);
文件写操作
下面展示一些 内联代码片
。
// writing on a text file
#include <fiostream.h>
int main () {
ofstream out("out.txt");
if (out.is_open())
{
out << "This is a line.\n";
out << "This is another line.\n";
out.close();
}
return 0;
}
文件读操作
// reading a text file
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
int main () {
char buffer[256];
ifstream in("test.txt");
if (! in.is_open())
{ cout << "Error opening file"; exit (1); }
while (!in.eof() )
{
in.getline (buffer,100);
cout << buffer << endl;
}
return 0;
}
状态标志符
is_open():文件是否正常打开
bad():读写过程中是否出错(操作对象没有打开,写入的设备没有空间)
fail():读写过程中是否出错(操作对象没有打开,写入的设备没有空间,格式错误--比如读入类型不匹配)
eof():读文件到达文件末尾,返回true
good():以上任何一个返回true,这个就返回false
#include<iostream>
#include<fstream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef char SElemType;
typedef struct StackNode{
SElemType data;
struct StackNode *next;
}StackNode ,*LinkStack;
//链栈的初始化
Status InitStack(LinkStack &s){//建空栈,栈顶值为空
s=NULL;
return OK;
}
//链栈的入栈
Status Push(LinkStack &S,SElemType e){
LinkStack p;
p=new StackNode;//生成新结点
p->data=e;//结点数域设为e
p->next=S;//新结点输入栈顶
S=p;//修改栈顶指针为p
return OK;
}
//链栈的出栈
Status Pop(LinkStack &S,SElemType &e){
LinkStack p;
if(S==NULL)
return ERROR;//栈空
e=S->data;//将栈顶元素赋给e
p=S;//用p临时保存栈顶元素空间,以备释放
S=S->next;//修改栈顶指针
delete p;//释放原栈顶元素空间
return OK;
}
//取链栈的栈顶元素
SElemType GetTop(LinkStack S){//返回栈顶元素的值,栈顶指针不变
if(S!=NULL)
return S->data;
}
int main()
{
LinkStack s;
int choose,flag=0;
SElemType j,t;
cout<<"1.初始化\n";
cout<<"2.入栈\n";
cout<<"3.读栈顶元素\n";
cout<<"4.出栈\n";
cout<<"0.退出\n\n";
choose=-1;
while(choose!=0){
cout<<"请选择:";
cin>>choose;
switch(choose){
case 1:
if(InitStack(s)){
flag=1;
cout<<"成功对栈进行了初始化\n\n" ;
}
else
cout<<"初始化栈失效\n\n";
break;
case 2:{
fstream file;//先建立一个文件流
file.open("SqStack.txt");//打开这个文件
if(!file){//没有正常打开
cout<<"错误!未找到文件!\n\n"<<endl;
exit(ERROR);
}
if(flag){
flag=1;
cout<<"进栈元素依次为:\n";
while(!file.eof()){//到结尾了吗
file>>j; //入到j变量
if(file.fail())//失败则暂停
break;
else {//没有失败,调用压栈
Push(s,j);
cout<<j<<" ";
}
}
cout<<endl<<" ";
}else
cout<<"栈未建立,请重新选择\n\n";
file.close();//打开的文件关闭
}
break;
case 3:
if(flag !=-1&&flag!=0)
cout<<"栈顶元素为,\n"<<GetTop(s)<<endl<< endl;
break;
case 4:
if(flag){
cout<<"依次弹出的栈顶元素为:\n";
while(Pop(s,t))
cout<<t<<" ";
cout<<endl<<endl;
}else
cout<<"栈未建立,请重新选择\n\n";
break;
}
}
return 0;
}
使用说明
创建一个 . t x t .txt .txt文件,输入若干字符,将其重命名为 S q S t a c k . t x t SqStack.txt SqStack.txt,将 S q S t a c k . t x t SqStack.txt SqStack.txt文件和上方代码运行的 . c p p .cpp .cpp文件放一个文件夹李即可运行。