㈠ 數據結構實驗(用c語言寫) 棧的基本操作
//順序棧
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define STACK_INIT_SIZE 100;
#define STACKINCREMENT 10;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
typedef int ElemType;
int InitStack(SqStack &S) //為棧S分配存儲空間,並置S為空棧
{
int size = STACK_INIT_SIZE;
S.base=(int *)malloc(size*sizeof(ElemType));
if(!S.base)
return 0;
S.top=S.base; //置棧S為空棧
S.stacksize=STACK_INIT_SIZE;
return 1;
}
int GetTop(SqStack S,int &e) //若棧不空,則用e返回S的棧頂元素
{
if(S.top==S.base) return 0;
e=*(S.top-1);
return 1;
}
int Push(SqStack &S, int e) /*進棧函數,將e插入棧S中,並使之成為棧頂元素*/
{ if(S.top-S.base>=S.stacksize) /*棧滿,追加存儲空間*/
{
int stackinvrement = STACKINCREMENT;
S.base=(ElemType *) realloc(S.base,(S.stacksize+stackinvrement)*sizeof(ElemType));
if(!S.base)
return 0; /*存儲分配失敗*/
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return 1;
}
int Pop(SqStack &S,int &e)/*出棧函數,若棧S不空,則刪除S的棧頂元素,用e返回其值*/
{ if(S.top==S.base) return 0;
e=*--S.top;
return 1;
}
void OutputStack(SqStack &S)
{int *q;
q=S.top-1;
for(int i=0;i<S.top-S.base;i++)
{
printf("%3d ",*q);q--;}
}
void main()
{
int a,b,c ;
char m;
SqStack s;
InitStack(s);
printf("請輸入要進棧的元素個數是:");
scanf("%d",&a);
printf("\n請輸入要進棧的%d個元素:",a);
for(b=0;b<a;b++) {
scanf("%d",&c);
Push(s,c); }
do { printf("\n");
printf("*********** 1.輸出棧的元素**********\n");
printf("*********** 2.取棧頂元素************\n");
printf("*********** 3.刪除棧頂元素**********\n");
printf("*********** 4.退出程序**********\n");
printf("\n請選擇一個字元:");
getchar();
scanf("%c",&m);
switch(m) {
case '1': printf("\n輸出的棧為:");
OutputStack(s);
break;
case '2': GetTop(s,c);
printf("\n棧頂元素為:%d",c);
printf("\n輸出的棧為:");
OutputStack(s);
break;
case '3': Pop(s,c);
printf("\n刪除的棧頂元素:%d",c);
printf("\n輸出的棧為:");
OutputStack(s);
printf("\n");
break;
case '4':break;
default: printf("輸入的數字有錯,請重新選擇!\n"); break;
}
}while(m!='4');
}
//鏈棧
#include<stdio.h>
#include<stdlib.h>
typedef struct SNode
{
int data;
struct SNode *next;
}SNode,*LinkStack;
LinkStack top;
LinkStack PushStack(LinkStack top,int x) //入棧
{
LinkStack s;
s=(LinkStack)malloc(sizeof(SNode));
s->data=x;
s->next=top;
top=s;
return top;
}
LinkStack PopStack(LinkStack top) //退棧
{
LinkStack p;
if(top!=NULL)
{
p=top;
top=top->next;
free(p);
printf("退棧已完成\n");
return top;
}
else printf("棧是空的,無法退棧!\n"); return 0;
}
int GetStackTop(LinkStack top) //取棧頂元素
{
return top->data;
}
bool IsEmpty()//bool取值false和true,是0和1的區別,bool只有一個位元組,BOOL為int型,bool為布爾型
{
return top==NULL ? true:false;
}
void Print()
{
SNode *p;
p=top;
if(IsEmpty())
{
printf("The stack is empty!\n");
return;
}
while(p)
{
printf("%d ", p->data);
p=p->next;
}
printf("\n");
}
void main()
{
int x,a,b;
char m;
do { printf("\n");
printf("###############鏈棧的基本操作##################\n");
printf("××××××××1.置空棧××××××××××\n");
printf("××××××××2.進棧×××××××××××\n");
printf("××××××××3.退棧×××××××××××\n");
printf("××××××××4.取棧頂元素××××××××\n");
printf("××××××××5.退出程序×××××××××\n");
printf("##############################################\n");
printf("\n請選擇一個字元:");
scanf("%c",&m);
switch(m){
case '1':
top=NULL;
printf("\n棧已置空!");
break;
case '2':
printf("\n請輸入要進棧的元素個數是:");
scanf("%d",&a);
printf("\n請輸入要進棧的%d個元素:",a);
for(b=0;b<a;b++) {
scanf("%d",&x);
top=PushStack(top,x); }
printf("進棧已完成!\n");
printf("\n輸出棧為:");
Print();
break;
case '3':
printf("\n操作之前的輸出棧為:");
Print();
top=PopStack(top);
printf("\n操作過後的輸出棧為:");
Print();
break;
case '4':
printf("\n輸出棧為:");
Print();
if(top!=NULL)
printf("\n棧頂元素是:%d\n",GetStackTop(top));
else
printf("\n棧是空的,沒有元素!");
break;
case '5':break;
default:
printf("\n輸入的字元不對,請重新輸入!");
break;
}
getchar();
}while(m!='5');
}
㈡ 用C語言批量更改文件名
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
#include <iconv.h>
#include <errno.h>
/*int to_iconv(char *in,size_t in_bytes,char *out,size_t out_bytes,
const char *from,const char *to)*/
int to_iconv(char *in,char *out,size_t out_bytes,const char *from,const char *to)
{
iconv_t cd;
size_t in_bytes=strlen(in);
//size_t out_bytes;
if((cd=iconv_open(to,from)) == (iconv_t)-1)
{
perror("iconv_open");
return -1;
}
if(iconv(cd,&in,&in_bytes,&out,&out_bytes) == -1)
{
perror("iconv");
return -1;
}
iconv_close(cd);
return 0;
}
void read_and_iconv(char *path,const char *from,const char *to)
{
DIR *dirp;
struct dirent *dir;
struct stat buf;
char temp[512]; //用於保存轉換後的文件名稱
if((dirp=opendir(path)) == NULL) //讀取文件夾
{
perror("opendir");
return;
}
chdir(path); //進入到該文件夾內部
while(dir=readdir(dirp)) //讀取該文件夾下所有文件
{
if((strcmp(dir->d_name,".") == 0) || (strcmp(dir->d_name,"..") == 0))
//過濾掉.以及..文件夾,不然會死循環的
continue;
bzero(temp,sizeof(temp));
to_iconv(dir->d_name,temp,sizeof(temp),from,to); //進行編碼轉換
rename(dir->d_name,temp); //進行重命名
printf("rename %s to %s\n",dir->d_name,temp);
stat(temp,&buf);
if(S_ISDIR(buf.st_mode)) //判斷當前讀取的文件是否為文件夾
{
read_and_iconv(temp,from,to); //如果是則遞歸處理
chdir(".."); //處理完成後一定要記得返回上一層目錄哦,不然其它文件就無法處理了
}
}
closedir(dirp);
}
int main(int argc,char **argv)
{
read_and_iconv(argv[1],argv[2],argv[3]);
/*第一個參數是要轉換的文件夾所在的文件夾名稱
*第二個參數是文件名稱所使用的編碼(這里為GBK)
*第三個參數是要轉換成何種編碼(這里為UTF-8)
*/
return 0;
}
㈢ c語言中char basename="sim",filename是什麼意思
char basename="sim"
這種定義方法是錯誤的,字元類型的變數不能被賦字元串,應該是 char *basename="sim";
㈣ define的用法
有三種用法,例如替代多行的代碼、條件編譯,還有典型的宏定義,具體如下:
1、define最重要的用法是條件編譯
#ifdef WINDOWS
......
......
#endif
#ifdef LINUX
......
......
#endif
可以在編譯的時候通過#define設置編譯環境
2、典型的使用方法
使用宏定義我們可以自己根據自己的習慣來定義甚至改變C語言的語法習慣,例如:
#defineBEGIN {
#defineEND }
int main()BEGIN
printf ("DEFINE---- ");
定義一個循環
#define LOOP for(;;)
重新定義數據類型
#define IT int
3、define可以替代多行的代碼,在每一個換行的時候加上一個""
#define MAX(X,Y) do {
語句1;
語句2;
/* 注釋的寫法 */
} while(0) /* (no trailing ; ) */
(4)c語言basename擴展閱讀:
參數
#define GPEBLT_FUNCNAME(basename) (SCODE (GPE::*)(struct GPEBltParms *))&GPE::##basename
在#define中,標准只定義了#和##兩種操作。#用來把參數轉換成字元串,##則用來連接前後兩個參數,把它們變成一個字元串。
#include<stdio.h>
#definepaster(n)printf("token"#n"=%d ",token##n)
intmain(void)
{
inttoken9=10;
paster(9);
return0;
}
輸出為:token 9 = 10
㈤ C語言中定義的__FILE__使用,如何只出現該文件名,而不顯示路徑
可以用宏定義來實現去除文件名中的路徑名。
因為windows和linux下,文件名中的路徑分隔符號不同,windows中是"/",而linux中是"/",所以,採用的宏不同:
#include<string.h>//strrchr()函數所需頭文件
windows:
#definefilename(x)strrchr(x,'\')?strrchr(x,'\')+1:x
linux:
#definefilename(x)strrchr(x,'/')?strrchr(x,'/')+1:x
調用:
printf("filename:%s ",filename(__FILE__));
相關函數說明:
函數原型:char *strrchr(const char *s, int c);
函數功能:The strrchr() function returns a pointer to the last occurrence of the character 【c】 in the string 【s】.函數返回一個指向最後一次出現在字元串s中的字元c的位置指針,如果c不在s中,返回NULL。
PS:linux中提供了相應的函數:basename(s),用來獲取不帶路徑的文件名。
㈥ C語言中的typedef是什麼意思啊
typedef為C語言的關鍵字,作用是為一種數據類型定義一個新名字。這里的數據類型包括內部數據類型(int,char等)和自定義的數據類型(struct等)。
在編程中使用typedef目的一般有兩個,一個是給變數一個易記且意義明確的新名字,另一個是簡化一些比較復雜的類型聲明。
(6)c語言basename擴展閱讀:
C語言允許用戶使用 typedef 關鍵字來定義自己習慣的數據類型名稱,來替代系統默認的基本類型名稱、數組類型名稱、指針類型名稱與用戶自定義的結構型名稱、共用型名稱、枚舉型名稱等。
一旦用戶在程序中定義了自己的數據類型名稱,就可以在該程序中用自己的數據類型名稱來定義變數的類型、數組的類型、指針變數的類型與函數的類型等。
例如,C 語言在 C99 之前並未提供布爾類型,但可以使用 typedef 關鍵字來定義一個簡單的布爾類型。
參考資料來源:網路—typedef
㈦ 用c語言或者python將文件中特定字元串後面的數字相加
代碼應該不難吧。既然用爬蟲爬下來了,為什麼爬取數據的時候沒做處理呢。
之前用過Scrapy爬蟲框架,挺好用的,你可研究下。
代碼:
#!coding=utf-8
importos
importre
importrandom
#獲取當前目錄文件列表
defgetNum():
flist=os.listdir(os.getcwd())
#遍歷文件
forfinflist:
iff!=os.path.basename(__file__):
withopen(f,'r')asfn:
text=fn.read()
num=re.findall(r'評論人數:(d+)',text)
printf,num
#文件寫入測試
deftest():
foriinrange(10):
withopen('%d.txt'%i,'w')asf:
f.write('文件:%d 每家餐館是一個文件,統計評論數,求讀取每個文件中「評論人數:%d」中的60並相加,求具體程序,60是個例子'%(i,random.randint(1,200)))
printu'文件寫入完畢'
if__name__=='__main__':
#test()
getNum()
代碼基本符合要求,但健壯性有些差。你自己用的時候修改吧
測試結果:
C:Python27python.exeD:/11/c.py
文件寫入完畢
0.txt['131']
1.txt['181']
2.txt['56']
3.txt['119']
4.txt['18']
5.txt['103']
6.txt['88']
7.txt['115']
8.txt['160']
9.txt['136']
Processfinishedwithexitcode0
㈧ c語言如何獲取用戶通過鍵盤輸入的文件目錄中的文件名和文件路徑,ballball大佬幫幫我🙏求代碼
int main()
{
string s = "c:\\abc\\def\\text.txt";
int xie_index = s.find_last_of('\\'); // 路徑中最後一個\的位置
string file_dirname = s.substr(0, xie_index + 1);
string file_basename = s.substr(xie_index + 1, s.size());
cout << file_dirname << endl << file_basename << endl;
}
㈨ 有個梅森旋轉素數演算法(MT199937)c語言代碼相關的問題,希望大神們能給我講解一下,感激不盡呀。
這個是宏定義,#define
#define GPEBLT_FUNCNAME(basename) (SCODE (GPE::*)(struct GPEBltParms *))&GPE::##basename
在#define中,標准只定義了#和##兩種操作。#用來把參數轉換成字元串,##則用來連接前後兩個參數,把它們變成一個字元串。
#include<stdio.h>
#define paster(n) printf("token"#n"=%d\n",token##n)
int main(int argc,char *argv[])
{
int token9=10;
paster(9);
return 0;
}
輸出為:token 9 = 10
詳細請看網路:#define
㈩ C語言中typedef struct什麼意思
類型定義。
它就和define相對應,define是把一個自己起的名字的常量定義為代替它的另一個常量來同。
typedef是把一個自己起的名字的類型用已經有的類型代替使用,如:typedef int Type1;之後如果有Type1 i ;系統則理解為int i;。
在編程中使用typedef目的一般有兩個,一個是給變數一個易記且意義明確的新名字,另一個是簡化一些比較復雜的類型聲明。
輸出為:token 9 = 10
詳見網路typedef(相似)。