數據結構——零基礎建棧

代碼講解

結構體

結構體:可以將多種數據類型組合組合起來的結構,可以避免變量的反覆聲明,聲明方式如下,值得注意的是結構體也是種數據類型,可在另一結構體中定義。

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”);

"type  int+type\,\, int+別名"的作用

用typedef來爲類型起個別名,如“typedef long INDEX;”。給long這樣的類型起別名主要目的不是簡化程序的書寫,它有兩個用處:一是表明該類型的特殊作用,二是將來有可能要改變這種類型(比如提高精度),如果直接聲明爲long型則失去了程序的可惟護性——每一個變量的聲明都要改動;而聲明爲INDEX則使維護程序變得十分簡單——只要改一下typedef語句即可。

比如

typedef  int  datetypetypedef \, \,int\,\, datetype

然後下面有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);
}

如果你沒用datetypedatetype而是直接用的intint,當你希望這些函數計算浮點數的時候,你就必須把所有代碼裏的所有intint都換成floatfloat或者doubledouble,而且一旦有地方換漏了就很容易出錯,丟失精度什麼的

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;
}

使用說明

創建一個.txt.txt文件,輸入若干字符,將其重命名爲SqStack.txtSqStack.txt,將SqStack.txtSqStack.txt文件和上方代碼運行的.cpp.cpp文件放一個文件夾李即可運行。

參考資料

26鏈棧實現代碼講解(數據結構)
數據結構中 爲什麼要用typedef int datatype ,而不直接用int

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章