R7-1 堆栈操作合法性分数
假设以S和X分别表示入栈和出栈操作。如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入序列,判断该序列是否合法。
输入格式:
输入第一行给出两个正整数N和M,其中N是待测序列的个数,M(≤50)是堆栈的最大容量。随后N行,每行中给出一个仅由S和X构成的序列。序列保证不为空,且长度不超过100。
输出格式:
对每个序列,在一行中输出YES如果该序列是合法的堆栈操作序列,或NO如果不是。
我的代码
#include
#include
#define MAX 100
#define ERROR -1
typedef enum { false, true } bool;
typedef struct SNode *PtrToSNode;
struct SNode{
char *Data;
int Top;
int Max;
};
typedef PtrToSNode Stack;
Stack CreatStack(int Max);
bool Push(Stack S,char ch);
bool Pop(Stack S);
int main(void){
int n,m,i,j;
char ch;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++){
Stack S=CreatStack(MAX);
for(j=1;j<=m;j++){
scanf("%c",ch);
if(ch=='S'){
Push(S,ch);
}else if(ch=='X'){
Pop(S);
}
}
if(S->Top==-1){
printf("YES\n");
}else{
printf("NO\n");
}
}
return 0;
}
Stack CreatStack(int Max){
Stack CreatStack(int Max);
Stack S=(Stack)malloc(sizeof(struct SNode));
S->Data=(int *)malloc(Max *sizeof(int));
S->Top=-1;
S->Max=Max;
return S;
}
bool Push(Stack S,char ch){
if(S->Top==S->Max-1){
return false;
}else{
S->Data[++(S->Top)]=ch;
return true;
}
}
bool Pop(Stack S){
if(S->Top==-1){
//printf("NO\n");
return ERROR;
}else{
return S->Data[(S->Top)--];
}
}
输出总得错误,有人能帮忙看看该怎么改?实在想不出了,先谢谢了(^~^)
修改如下,供参考:
#include <stdio.h>
#include <stdlib.h>
//#define MAX 100 修改
#define ERROR 0
#define OK 1
//typedef enum { false, true } bool; 修改
typedef struct SNode *PtrToSNode;
struct SNode{
int *Data; //char *Data; 修改
int Top;
int Max;
};
typedef PtrToSNode Stack;
Stack CreatStack(int Max);
bool Push(Stack S,char ch);
bool Pop(Stack S);
int main(void){
int n,m,i,j;
char ch;
scanf("%d %d",&n,&m);
getchar(); //修改
Stack S=CreatStack(m); //修改 Stack S=CreatStack(MAX);
for(i=1,j=0;i<=n;i++) //修改
{
while ((ch = getchar()) != '\n'){ //for(j=1;j<=m;j++)
//scanf("%c",ch);
if(ch == 'S'){
if (ERROR == Push(S,ch))
j = 1; //栈满入栈
}else if(ch == 'X'){
if (ERROR == Pop(S))
j = 1; //栈空出栈
}
}
if(S->Top == -1 && !j){ // 修改
printf("YES\n");
}else{
printf("NO\n");
}
j = 0; // 复位 下一轮准备
}
return 0;
}
Stack CreatStack(int Max){
//Stack CreatStack(int Max); 多余
Stack S=(Stack)malloc(sizeof(struct SNode));
S->Data=(int *)malloc(Max *sizeof(int));
S->Top=-1;
S->Max=Max;
return S;
}
bool Push(Stack S,char ch){
if(S->Top==S->Max-1){
return ERROR;
}else{
S->Data[++(S->Top)]=ch;
return OK;
}
}
bool Pop(Stack S){
if(S->Top==-1){
//printf("NO\n");
return ERROR;
}else{
S->Data[(S->Top)--];
return OK; //true;
}
}
else if(ch=='X'){
Pop(S);
}
这里要对 Pop是否成功判断啊
否则明明堆栈不平衡,X很多,反复Pop
你还是判断成功
编程基础第六版 课后题
代码如下
#include <stdio.h>
#include <math.h>
int main()
{
int i,j,t;
int a[15];
int x,l,h,mid,n;
n=15;
l=0;
h=n-1;
printf("请输入15个不同数字,按一次输入一个,依次输入15次的方法输入数字:\n");
for(i=0;i<15;i++)
scanf("%d",&a[i]);
for(j=0;j<14;j++)
{
for(i=0;i<14-j;i++) //这里我第一次写也忽略了j要不断的去替换i,所以对于i来说它的循环条件应该是14-j,有好多人可能和我一样写成i<15啦
if( a[i]<a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
}
printf("按从大到小的排序结果:");
for( i=0;i<15;i++)
printf("%d\t",a[i]);
printf("\n");
for (l=0, h=14, printf("请输入一个数:"), scanf("%d", &x); l<=h;)//while也可以但是我很奇怪用while会提前退出循环哈哈哈
{
mid=(l+h)%2;
if (x>a[mid])h=mid-1;
else if (x<a[mid])l=mid+1;
else
{
printf("%d是第%d位数",x,mid+1);
break;
}
}
if(x!=a[mid])
printf("查无此数!");
return 0;
}