我想實作的是堆疊的基本操作以及對輸入的字符序列進行判斷的操作,具體功能為判斷讀入的一串字符是否符合要求:序列1&序列2,其中序列1和序列2為逆序比如a+b&b+a符合要求,1+3&3-1則不符合要求。
遇到的問題:1.在實作應用功能時,進行判斷可能出現錯誤,輸入正確序列也會輸出“不符合要求”。
2.在實作堆疊的基本操作時,在主函式的case1里面 while回圈運算式中StackLength(s)>0的話回圈憑空最后會再進行一次,如果改成StackLength(s)>1的話結果輸出就會正確,不知道是為什么。
跪求大神指導,謝謝了。以下是代碼:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include<process.h>
/* exit() */
#define STACK_INIT_SIZE 100 //初始堆疊空間分配能夠存盤的ElementType元素個數
#define STACKINCREMENT 10 //堆疊空間不夠用后每次增加的存盤量
typedef short Status;//回傳狀態值
typedef struct{
char value;
}ElementType;
//typedef char ElementType;
typedef struct{
ElementType *base;//堆疊底指標;
ElementType *top;//堆疊頂指標;
int stacksize;//當前堆疊總共能容納多少個ElementType元素,也就是最大容量
}SqStack;
//根據以上定義,完成如下功能(使用順序存盤結構)
Status InitStack(SqStack &S)//構造一個空堆疊,分配堆疊空間
{
S.base = (ElementType*)malloc(STACK_INIT_SIZE*sizeof(ElementType));
if(!S.base)
exit(0);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return 1;
}
Status DestoryStack(SqStack &S)//銷毀一個已分配的堆疊,回收堆疊空間
{
free(S.base);
S.base = NULL;
S.top = NULL;
S.stacksize = 0;
return 1;
}
Status StackEmpty(SqStack S)//判斷S是否為空堆疊,是回傳1,否則回傳0
{
if(S.base == S.top)
return 1;
else
return 0;
}
int StackLength(SqStack S)//回傳S中元素個數
{
return S.top-S.base;
}
Status GetTop(SqStack S,ElementType &e)//回傳堆疊頂元素給e,如果空堆疊函式回傳-1,正常回傳1
{
if(S.top>S.base)
{
e = *(S.top-1);
printf("堆疊頂元素為:%c\n",e.value);
return 1;
}else
return -1;
}
Status Push(SqStack &S,ElementType e)//插入e為新的堆疊頂元素,如果堆疊空間不夠,自動擴充(realloc函式)
{
if(S.top-S.base>=S.stacksize)
{
S.base = (ElementType *)realloc(S.base,(S.stacksize + STACK_INIT_SIZE));
if(!S.base)
exit(0);
S.top = S.base+S.stacksize;
S.stacksize = S.stacksize+STACKINCREMENT;
}
*(S.top)=e;
S.top++;
return 1;
}
Status Pop(SqStack &S,ElementType &e)//從堆疊中洗掉堆疊頂元素,并放在e中,空堆疊函式回傳-1,正常回傳1
{
if(S.top == S.base)
return 0;
else
S.top = S.top-1;
e = *(S.top);
return 1;
}
Status Judge(SqStack S,ElementType &e)
{
while(S.top>S.base)
{
if((S.top-1)->value=https://bbs.csdn.net/topics/=(S.base)->value)
{
S.top = S.top-1;
S.base = S.base+1;
}
else
return 0;
}
if((S.top)->value =='&'||(S.base)->value =='&')
return 1;
else
return 0;
}
void print(SqStack S)
{
printf("此時堆疊內元素為:\n");
while(S.top>S.base)
{
S.top=S.top-1;
// printf("此時堆疊內元素為:\n");
printf("%c\t",S.top->value);
}
printf("\n");
}
int main()
{
SqStack s;
ElementType x;
int a;
int i;
InitStack(s);
printf("請選擇測驗內容(1為實驗一,2為實驗2)\n");
scanf("%d",&a);
switch(a)
{
case 1:{
//ElementType c;
printf("請輸入5個字符:\n");
for(i=0;i<6;i++)
{
scanf("%c",&x.value);
Push(s,x);
}
//printf("111");
//print(s);
do{
GetTop(s,x);
print(s);
Pop(s,x);
}while(StackLength(s)>1);
puts("\n");
};break;
case 2:
{
printf("請輸入奇數個字符(要以序列1&序列2的形式輸入,中間用&隔開,其中序列1和序列2為逆序)\n");
int d;
printf("請輸入要輸入的字符數:");
scanf("%d",&d);
printf("請輸入字符:\n");
for(i=1;i<=d;i++)
{
scanf("%c",&x.value);
Push(s,x);
}
if(Judge(s,x))
printf("符合要求!\n");
else
printf("不符合要求!\n");
//printf("正在開發中...");
};break;
default:printf("正在開發..");break;
}
}
uj5u.com熱心網友回復:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <unistd.h>
//#include<process.h>
/* exit() */
#define STACK_INIT_SIZE 100 //初始堆疊空間分配能夠存盤的ElementType元素個數
#define STACKINCREMENT 10 //堆疊空間不夠用后每次增加的存盤量
typedef short Status;//回傳狀態值
typedef struct{
char value;
}ElementType;
//typedef char ElementType;
typedef struct{
ElementType *base;//堆疊底指標;
ElementType *top;//堆疊頂指標;
int stacksize;//當前堆疊總共能容納多少個ElementType元素,也就是最大容量
}SqStack;
//根據以上定義,完成如下功能(使用順序存盤結構)
Status InitStack(SqStack &S)//構造一個空堆疊,分配堆疊空間
{
S.base = (ElementType*)malloc(STACK_INIT_SIZE*sizeof(ElementType));
if(!S.base)
exit(0);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return 1;
}
Status DestoryStack(SqStack &S)//銷毀一個已分配的堆疊,回收堆疊空間
{
free(S.base);
S.base = NULL;
S.top = NULL;
S.stacksize = 0;
return 1;
}
Status StackEmpty(SqStack S)//判斷S是否為空堆疊,是回傳1,否則回傳0
{
if(S.base == S.top)
return 1;
else
return 0;
}
int StackLength(SqStack S)//回傳S中元素個數
{
return S.top-S.base;
}
Status GetTop(SqStack S,ElementType &e)//回傳堆疊頂元素給e,如果空堆疊函式回傳-1,正常回傳1
{
if (S.top <= S.base)
return -1;
e = *(S.top-1);
printf("堆疊頂元素為:%c\n",e.value);
return 1;
/*
if(S.top > S.base)
{
e = *(S.top-1);
printf("堆疊頂元素為:%c\n",e.value);
return 1;
}else
return -1;
*/
}
Status Push(SqStack &S,ElementType e)//插入e為新的堆疊頂元素,如果堆疊空間不夠,自動擴充(realloc函式)
{
if(S.top-S.base>=S.stacksize)
{
//S.base = (ElementType *)realloc(S.base,(S.stacksize + STACK_INIT_SIZE));
S.base = (ElementType *)realloc(S.base,(S.stacksize + STACK_INIT_SIZE) * sizeof(ElementType));
if(!S.base)
exit(0);
S.top = S.base+S.stacksize;
S.stacksize = S.stacksize+STACKINCREMENT;
}
//*(S.top) = e;
*(S.top) = e;
S.top++;
return 1;
}
Status Pop(SqStack &S,ElementType &e)//從堆疊中洗掉堆疊頂元素,并放在e中,空堆疊函式回傳-1,正常回傳1
{
//if(S.top == S.base)
if(S.top <= S.base)
return 0;
else
//S.top = S.top-1;
S.top--;
e = *(S.top);
return 1;
}
Status Judge(SqStack S,ElementType &e)
{
while(S.top>S.base)
{
if((S.top-1)->value=https://bbs.csdn.net/topics/=(S.base)->value)
{
S.top = S.top-1;
S.base = S.base+1;
}
else
return 0;
}
if((S.top)->value =='&'||(S.base)->value =='&')
return 1;
else
return 0;
}
void print(SqStack S)
{
if (S.top <= S.base)
return;
printf("++此時堆疊內元素為:");
while(S.top>S.base)
{
// printf("此時堆疊內元素為:\n");
S.top = S.top-1;
printf("%c(%d)\t",S.top->value, S.top->value);
}
printf("\n");
}
int main()
{
SqStack s;
ElementType x;
int a;
int i;
InitStack(s);
printf("請選擇測驗內容(1為實驗一,2為實驗2)\n");
scanf("%d",&a);
getchar(); // for '\n'
switch(a)
{
case 1:{
//ElementType c;
printf("請輸入5個字符:\n");
//for(i=0;i<6;i++)
for(i=0;i<5;i++)
{
scanf("%c",&x.value);
Push(s,x);
}
//printf("111");
//print(s);
do{
GetTop(s,x);
print(s);
Pop(s,x);
}while(StackLength(s)>0);
puts("\n");
};break;
case 2:
//{
printf("請輸入奇數個字符(要以序列1&序列2的形式輸入,中間用&隔開,其中序列1和序列2為逆序)\n");
int d;
printf("請輸入要輸入的字符數:");
scanf("%d",&d);
printf("請輸入字符:\n");
for(i=1;i<=d;i++)
{
scanf("%c",&x.value);
Push(s,x);
}
if(Judge(s,x))
printf("符合要求!\n");
else
printf("不符合要求!\n");
//printf("正在開發中...");
// };
break;
default:
printf("正在開發..");break;
}
}
供參考~
注意提示輸入5個,其實是輸入6個。
另外,輸入a之后的換行符。
其他認為有問題的也一并改了,詳見上面的代碼~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/108770.html
標籤:C語言
