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值大小相比較),直到出現不同的字元或遇'