當前位置:首頁 » 編程語言 » c語言字元串比較演算法
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言字元串比較演算法

發布時間: 2022-06-12 02:22:11

A. 編寫一個演算法利用順序棧判斷一個字元串是否是對稱串 c語言

#include<stdio.h>
#include<malloc.h>
#include"string.h"
#definestack_init_size100
#definestackincrement10
#defineoverflow0
#defineok1
#defineerror0


typedefstruct{
char*base;
char*top;
intstacksize;
}sqstack;

intinitstack(sqstack&sq)/*初使化堆棧*/
{
sq.base=(char*)malloc(stack_init_size*sizeof(char));
if(!sq.base)returnoverflow;
sq.top=sq.base;
sq.stacksize=stack_init_size;
returnok;
}

intpush(sqstack&sq,chare)/*壓棧*/
{
if(sq.top-sq.base>sq.stacksize)
{
sq.base=(char*)realloc(sq.base,(sq.stacksize+stackincrement)*sizeof(char));
sq.top=sq.base+sq.stacksize;
sq.stacksize+=stackincrement;
}
*sq.top++=e;
}

intpop(sqstack&sq,char&e)/*出棧*/
{
if(sq.top==sq.base)returnerror;
e=*--sq.top;
returnok;
}

intmain()/*主程序壓入1到100,然後再彈出*/
{
inti,length;
chare;
inta[100];
charstr[20]="abcdefedcba";
length=strlen(str);
sqstacksq;
initstack(sq);
for(i=0;i<length;i++){
push(sq,str[i]);
}
for(i=0;i<length;i++){
pop(sq,e);
if(e!=str[i]){
printf("ERROR ");
return0;
}
}
printf("CORRECTLY!");
return1;
}

B. 二維字元串數組 使用快速排序的 C語言演算法,就是對二維字元數組上每行的字元串進行排序。

能,我幫你寫了一個,你可以作參考:
#include<string.h>
#include<stdio.h>
void quicksort(char s[][100],int left,int right)
{
int i=left,j=right,p=left;
char temp[100];
strcpy(temp,s[left]);
while(i<j)
{
while(strcmp(s[j],temp)>=0&&j>=p)j--;
if(j>=p)strcpy(s[p],s[j]),p=j;
while(strcmp(s[i],temp)<=0&&i<=p)i++;
if(i<=p)strcpy(s[p],s[i]),p=i;
}
strcpy(s[p],temp);
if(p-left>1)quicksort(s,left,p-1);
if(right-p>1)quicksort(s,p+1,right);
}
int main()
{
int i;
char s[][100]={"dafad","fadfadsf","fdafaddsaf","fadfdfs","rqe","afaerffa"};
quicksort(s,0,5);
for(i=0;i<6;i++)
puts(s[i]);
return 0;
}

C. 比較ab大小 用一行代碼,c語言

您好,如果只是問個演算法,我可以告訴你,但是如果是你要全部,那就不可以了,作業要自己做的啊!如果你要用戶輸入2個字元串作比較的話可以用「」來區分字元串1與字元串2然後把2個字元串存到2個數組里去比inti=1,j=1;chara[20],b[20]if(c=getchar()!="")then{a[i]=c;i++;}else{b[j]=c;j++;}然後用for循環一個一個比他們的大小就可以了,如果有一個大了就return大的值,如果遇到一個數組為空了,也return另外一個字元串就好了。

D. 解析一哈c語言中的kmp演算法,bf演算法,kr演算法之間的聯系與區別,盡量淺顯易懂,謝謝!

三種演算法聯系:都是字元串匹配演算法。
區別:
「KMP演算法」:在匹配過程稱,若發生不匹配的情況,如果next[j]>=0,則目標串的指針i不變,將模式串的指針j移動到next[j]的位置繼續進行匹配;若next[j]=-1,則將i右移1位,並將j置0,繼續進行比較。
「BF演算法」是普通的模式匹配演算法,BF演算法的思想就是將目標串S的第一個字元與模式串P的第一個字元進行匹配,若相等,則繼續比較S的第二個字元和P的第二個字元;若不相等,則比較S的第二個字元和P的第一個字元,依次比較下去,直到得出最後的匹配結果。
「KR演算法」在每次比較時,用HASH演算法計算文本串和模式串的HASH映射,通過比較映射值的大小來比較字元串是否匹配。但是考慮到HASH沖突,所以在映射值相同的時候,還需要近一步比較字元串是否相同。但是在每次比較時,需要計算HASH值,所以選擇合適的HASH演算法很重要。
略知一二!

E. 求助一c語言題字元串匹配的平凡演算法:我的代碼如下可是輸出的位置是錯的,怎麼改

似乎程序里有問題

//1.沒看到b的初始化
// 2. printf裡面,x也是變數,不是字元常量

寫個很直接的文字演算法給你

//a[ ]是應到課人員名單,b[ ]是實際到課人員名單的話
//對於每一個a[i]

//應該是看a[i]是否在b[]里出現對吧。也就是說,在實際到課名單里b[ ]中搜索一個應該到課的學生a[i],如果找到,則不用列出這個名字,否則輸出這個名字。而且需要每個蹺課的人(b中找不到的人)都輸出。
//所以:你的兩層循環變數沒有問題

//但是進入循環前 需要一個bool值NOTFound作為找到與否的標志,默認為真。
// 因為要和每一個b中的值進行比較,所以不到最後不知道是否缺課,
// 如果某個b[j]和a[i]相同

// 則置NOTFound為假,否則不變。
// 內層循環結束後,
// 如果NOTFound為真,輸出這個名字,即輸出a[i]
// 然後重置NOTFound為真.

如果不進行預排列,這個需要查找每個元素的演算法,時間復雜度是O(n*n),雙循環嘛,呵呵 。
你如果用open hash表一開始就對輸入的數據b[]進行排序和優化的話,比如前面有人說到的按首字母建立靜態數組,第0位代表字母a,第1位代表字母b,以此類推。然後首字母相同的單詞鏈接在數組對應的位置後面,那麼查找部分的效率可以變成接近O(n)。但是前面需要一些輔助函數,比如把字元轉化為數值,以及對節點的定義和鏈表的操作。

F. C語言的compare函數是在哪裡定義的演算法是什麼

C語言只有字元數組有庫函數strcmp函數,格式如下:

int strcmp(const char *str1, const char *str2);

如果左邊小於右邊的字元串,函數返回-1

如果左邊字元串等於右邊字元串,函數返回0

如果左邊字元串大於右邊字元串,函數返回1

一般基本數據類型的比較都可以用關系運算符,如果自定義的可以重載運算符或者使用函數對象,如果用C語言的方式,自定義一個比較函數就可以了,庫函數中沒有這種普適類型的比較函數。

(6)c語言字元串比較演算法擴展閱讀:

compare函數規則

當s1<s2時,返回為負數;

當s1=s2時,返回值= 0;

當s1>s2時,返回正數。

即兩個字元串自左向右逐個字元相比(按ASCII值大小相比較),直到出現不同的字元或遇''為止,如:

1."A"<"B" 2."A"<"AB" 3."Apple"<"Banana" 4."A"<"a" 5."compare"<"computer"

G. C語言數據結構大神快來。後面的附加題求助,有關字元串的演算法。

void insert(char* s, int pos, char* s0){
int i,len,len0;
len=stringlen(s);
len0=stringlen(s0);
for(i=strlen(s)-1;i>pos;i--)
*(s+i+len0)=*(s+i);
while((*s0)!='\0')
{
*(s+i)=*s0;
i++;
s0++;
}
*(s+len+len0-1)='\0';
}

void del(char* s, int pos, int len){

int i,count;
count=stringlen(s)-pos-len;
for(i=0;i<count;i++)
*(s+pos+i)=*(s+pos+len+i);
*(s+pos+count-1)='\0';
}

void replace(char* s, char* s0, char* s1){
{
int i,num,num1,len,len0,len1,increment;
len=stringlen(s);
len0=stringlen(s0);
len1=stringlen(s1);
increment=len1-len0;

for(num=0;num<len;num++)
{
if(s[num]==s0[0])
{
break;
}
}

if(increment!=0)
{
num1 = num+len0;
for(i=len-1;i>num2;i--)
{
*(s+i+increment)=*(s+i);
}
}
while((*s0)!='\0')
{
*(s+num)=*s0;
num++;
s0++;
}
*(s+len+increment-1)='\0';

}

H. 一道c語言的題目,將字元串存入數組後怎麼比較大小,求演算法

#include<stdio.h>
#include<string.h>
intmain()
{
charp[100];
inti,num=0,big=0,small=0,other=0;
gets(p);//vs2015應使用gets_s(p)
if(strcmp(p,"exit")==0)
{
printf("EndofInput ");
return0;
}
for(i=0;p[i]!='';i++)
{
if(p[i]>=48&&p[i]<=57)
num++;
elseif(p[i]>=65&&p[i]<=90)
big++;
elseif(p[i]>=97&&p[i]<=122)
small++;
else
other++;
}
printf("%d,%d,%d,%d ",num,big,small,other);
return0;
}

就是寫幾個判斷就可以了,希望對你有所幫助

I. 在線等,懸賞。C語言:對稱字元串+字元串比較大小+字元串長度比較。

#include<stdio.h>
#include<string.h>
#define M 11
#define N 81

int issy(char *str)
{
int i,j,length;
length=strlen(str);
for (i=0,j=length-1;i<j;i++,j--)
{
if(*(str+i)!=*(str+j))
return 0;
}
return 1;
}

void ls(char a[M][N])
{
char t[N];//這里是t[N] N是列數
int i,j,k=0;

while((strcmp(a[k],"")!=0))//判斷空串位置,計算行數
k++;
if(k>M)//如果行數超過最大行數,置最大行數
k=M;

for(i=0;i<k-1;i++)
{
for(j=i+1;j<k;j++)
{
if(strlen(a[i])>strlen(a[j]))
{
strcpy(t,a[i]);strcpy(a[i],a[j]);strcpy(a[j],t);
}
else if(strlen(a[i])==strlen(a[j]))
{
if(strcmp(a[i],a[j])>0)
{
strcpy(t,a[i]);strcpy(a[i],a[j]);strcpy(a[j],t);
}
}
}
}//外循環結束

for(i=0;i<k;i++)
printf("%s\n",a[i]);

}

int main()
{
char a[11][80],b[11][81],*p[11];
int i,j=0,n,k=0;
for(n=0;n<M;n++)
{
gets(a[n]);
if(strcmp(a[n],"")==0)
break;
}
for(i=0;i<M;i++)//初始化p[11]
p[i]=a[i];
//p=a;//這樣初始化不對
for(i=0;i<M;i++)
{

if(issy(p[i]))
{strcpy(b[j],a[i]);
if(strcmp(a[i],"")==0)//空串跳出,但要保留一次空串。
break;
j++;
k++;
}
}
ls(b);
if(k==0)
printf("None.\n");
return 0;

}

J. 請教一個 C語言 字元串數組之間比較的演算法,謝謝

這種時候當然是使用標准容器拉
std::map可以滿足你的需要

10個ip 地址 復制給10個std::string. 然後構造一個 std::map<std::string, int> 再逐個使用insert方法插入, 如果插入成功(通過檢查insert的返回值, 具體請搜索msdn,這里篇幅有限。)

如果插入成功, 繼續; 不成功,就表示有重復,將返回的那個已經存在的ip對應的優先順序++, 再繼續。

map的特點就是不重復,你省去了自己去寫比較,去優化的繁瑣,而且一般stl實現的效率都是很高的絕對不是你這種40多次的O(N)的,應該至少都是o(ln N)