問題如下:
給出乙個字串,包含(){}<>四種字元,試給出一演算法,實現字串格式檢查
檢查成對的字元是否位置正確有效
eg:<{}>()有效
asd<2gss>ss(s)d有效
《無效\
解決思路:
基本就是遍歷整個字串依次判斷,這裡提供一種技巧,就是用棧的方法。
所有的左括號都直接進棧,
然後右括號就判斷棧定是不是跟當前右括號匹配的,
如果匹配就兩個都出棧,如果不匹配就繼續遍歷,
最後棧是空的就說明是符合要求的。如果有不明白可以自己畫圖思考。這裡簡單舉例說明。
假如有字串" < [ ] > " ,有空增棧乙個。首先開始遍歷字串,查到第乙個特殊符號' < '把他入棧,然後繼續遍歷查到第二個特殊符號' [ '也入棧,然後第三個特殊符號' ] ',根據棧的特性,此時棧頂為' [ '判斷它是否和『 ] 』對應,如果對應則出棧,否則不進行操作。這裡是對應的就出棧了,同樣的道理遍歷到最後乙個元素時,也會有出棧操作,最終這個棧為空,說明所有特殊符號的位置是符合要求的。
而對於字串" [ ",我們可知在' [ '和' linkstack_t;
/** *@brief 建立乙個空的棧
*/linkstack_t *linkstack_creat()
header->next=null;
return header;
}/**
*@brief 檢查棧是否為空
*/int linkstack_empty(linkstack_t *header)
return 0;
}/**
*@brief 入棧
*/int linkstack_insert(linkstack_t *header,datatype_t value)
insert->data=value;
insert->next=header->next;
header->next=insert;
return 0;
}/**
*@brief 出棧
*/datatype_t linkstack_out(linkstack_t *header)
datatype_t linkstack_peek(linkstack_t *header)
/** *@brief 列印棧的所有資料
*/int linkstack_show(linkstack_t *header)
}/**
*@brief 檢查特殊符號是否對齊
*/ int check_str(char *str)
'||str_char == ')')
break;
case '}':
if(linkstack_peek(s1)=='
} str++;
} return linkstack_empty(s1);
} int main(void)
else
}
c語言記憶體對齊問題
計算機中的記憶體都是按照byte為單位進行分配,在理論上資料可以儲存在記憶體中的任意位置。計算機為了提高工作效率,一般要求記憶體中的資料存放在特定的位置,使計算機用最少的機器週期便可以訪問到這個資料,這就是c語言中的記憶體對齊問題。這裡以 int 型資料為例,如果記憶體中的資料按照4位元組對齊儲存,...
C語言結構體對齊 記憶體對齊問題
c語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。內容雖然很基礎,但一不小心就會弄錯。寫出乙個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?有人給對齊原則做過總結,具體在 看到現在已記不起來,這裡引用一下前人...
c語言位元組對齊問題(一)
在這裡只總結結構體的位元組對齊問題,看下面的結構體 struct s1 char a int b short c struct s2 char a short c int b 那麼sizeof s1 12,sizeof s1 8 我們可以假定結構體在記憶體中的位址是0x0000開始的,那麼我們說的位...