使用符號表模擬棧
符號表其實就是一個字典,使用兩個陣列實現
typedefint Item;
typedefint Key;
static Item *g_cache;//鍵的索引陣列,存在重複鍵,但是值是一個
static Item *g_Item;//是鍵-值陣列
staticint M;//陣列的大小
int indexX;//陣列的索引
//存入陣列
void key(Item aItem,Key aKey)
{
g_Item[aItem] = aKey;
}
void STinit(int n)
{
g_cache =malloc(sizeof(&g_cache)*n);
if (!g_cache
{
printf("create failed!!");
return;
}
g_Item =malloc(sizeof(&g_Item)*n);
if (!g_Item)
{
printf("create failed!!!!!");
return;
}
M = n;
indexX =0;
memset(g_Item,0,sizeof(&g_Item)*n);
memset(g_cache,0,sizeof(&g_cache)*n);
}
int STcount()
{
returnindexX;
}
void STinsert(Item aItem)
{
if (indexX >=M)
{
g_cache =realloc(g_cache,M/2);
g_Item =realloc(g_Item,M/2);
M =M +M/2;
}
g_cache[indexX++] = aItem;
}
Item STmove(Key aKey)
{
int tempItem =0;
Item* tempCache =malloc(sizeof(&tempCache)*M);
if (!tempCache)
{
printf("create failed!!");
printf("search result failed!!");
return tempItem;
}
memset(tempCache,0,sizeof(&tempCache)*M);
int i =0;
int n =STcount();
int tempIndex =0;
for (i = --n;i >=0;--i)
{
tempCache[tempIndex++] =g_cache[i];
if (g_Item[g_cache[i]] == aKey)
{
tempItem =1;
break;
}
}
for (int j = --tempIndex;j >=0;--j,++i)
{
if (i <0)
{
i =0;
}
g_cache[i] = tempCache[j];
}
if (!tempItem)
{
printf("search result failed!!");
}
free(tempCache);
tempCache =NULL;
return tempItem;
}
Item STsearch(Key aKey)
{
returnSTmove(aKey);
}
int STdeleteRepeat(Item aItem)
{
int ret = 0;
Item* tempCache = malloc(sizeof(&tempCache)*M);
if (!tempCache)
{
printf("create failed!!");
printf("search result failed!!");
return ret;
}
memset(tempCache, 0, sizeof(&tempCache)*M);
int n = STcount();
int tempIndex = 0;
for (int i = --n;i >=0;--i)
{
if (g_cache[i] == aItem)
{
ret +=1;
}
else
{
tempCache[tempIndex++] =g_cache[i];
}
}
memset(g_cache,0,sizeof(&g_cache)*n);
for (int i = --tempIndex,j =0;i >= 0;--i,++j)
{
g_cache[j] = tempCache[i];
}
free(tempCache);
tempCache =NULL;
indexX -=ret;
return ret;
}
void STdelete(Item aItem)
{
if(STdeleteRepeat(aItem))
{
printf("delete successfull:%d\n",aItem);
}
else
{
printf("delete failed:%d\n",aItem);
}
}
Item STselect(int aSelect)
{
if (aSelect <0||aSelect >=M)
{
return0;
}
if (g_Item[g_cache[aSelect]])
{
printf("select successfull");
}
else
{
printf("select failed");
}
returng_cache[aSelect];
}