【数据结构】零基础建栈

代码讲解

结构体

结构体:可以将多种数据类型组合组合起来的结构,可以避免变量的反复声明,声明方式如下,值得注意的是结构体也是种数据类型,可在另一结构体中定义。

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文件放一个文件夹李即可运行。

参考资料

26链栈实现代码讲解(数据结构)
数据结构中 为什么要用typedef int datatype ,而不直接用int

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一拳Marx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值