7-2 栈操作的合法性--栈

假设以SX分别表示入栈和出栈操作。如果根据一个仅由SX构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入SX序列,判断该序列是否合法。

输入格式:

输入第一行给出两个正整数 n 和 m,其中 n 是待测序列的个数,m(≤50)是堆栈的最大容量。随后 n 行,每行中给出一个仅由SX构成的序列。序列保证不为空,且长度不超过100。

输出格式:

对每个序列,在一行中输出YES如果该序列是合法的堆栈操作序列,或NO如果不是。

输入样例:

4 10
SSSXXSXXSX
SSSXXSXXS
SSSSSSSSSSXSSXXXXXXXXXXX
SSSXXSXXX

输出样例:

YES
NO
NO
NO

一些反思:

①maxsize-1为数组下标的最后一个,所以top = maxsize的时候是满的

②栈每次都要重置

这次比之前写的时间效率要高4倍!

建议手敲一遍,不要直接复制!

//由于给出了最大容量,所以顺序栈更好 
//注意事项,每次循环栈都要重置 
#include<stdio.h>
#include<stdlib.h>
typedef struct{
	char *s;
	int top;
	int maxsize;
}SqStack;
int push(SqStack *S,char ch){
	if(S->top==S->maxsize)return 0;
	S->s[S->top++] = ch;
	return 1;
}
int pop(SqStack *S){
	if(S->top == 0)return 0;
	S->top--;
	return 1;
}
int main()
{
	//两个变量存储第一行
	int line,size;
	scanf("%d %d",&line,&size);
	getchar();
	
	char ch;//存单个字符 
	int re;
	for(int i=0;i<line;i++)
	{
		//定义一个空的顺序栈 
		SqStack S;
		S.s = (char*)malloc(sizeof(char)*size);
		S.top = 0;
		S.maxsize = size;
		
		re = 1;//存储push和pop的结果 
		scanf("%c",&ch);
		while(ch!='\n')
		{
			//如果是S,那么判断入栈是否成功,如果push失败直接结束该行循环 
			if(ch=='S'&&push(&S,ch)==0){
				re = 0;
				break; 
			}
			//同理 
			if(ch=='X'&&pop(&S)==0){
				re = 0;
				break;
			}
			//读入下一个 
			//如果re==0了就必须把后面的吃掉
			if(re == 0)while((ch = getchar())!='\n');
				else scanf("%c",&ch);
		}
		if(re==1&&S.top==0)printf("YES\n");
		else printf("NO\n");	
	}
	return 0; 
} 

C语言中,是一种内存数据结构,通常用于函数调用、局部变量存储以及一些临时数据的操作。7-16这个描述可能是某个具体的题目或者阶段,涉及到对操作的理解和检查其合法性操作合法性主要包括以下几个方面: 1. **入(Push)**:只有当顶元素的位置还有足够的空间时,才能将新的元素压入顶。如果已满,即顶指针到达了的最大容量,此时的入操作就是非法的。 2. **出(Pop)**:出操作需要从顶删除并返回元素,前提是有元素可供弹出。空尝试出也是非法的。 3. **查看顶元素(Peek)**:合法操作,可以访问但不改变顶元素,前提是非空。 4. **判断是否为空(IsEmpty)和是否已满(IsFull)**:这两个操作是检查的状态,用于判断是否能进行插入或删除操作。 5. **修改大小(Resize Stack)**:在C语言标准库中,通常是固定大小的,动态调整大小通常不是标准操作,但在某些自定义实现或者特定环境下,如果允许的话,这可以看作是一个合法的高级操作C语言中通常通过`push()`、`pop()`、`top()`(类似于peek但没有直接返回值,而是将结果存放在一个临时变量中)等系统调用或自定义函数来操作。例如: ```c #include <stdio.h> #include <stdlib.h> typedef struct { int *data; int top; // 顶指针 int size; // 的大小 } Stack; // 初始化一个 Stack* initStack(int size) { Stack* s = (Stack*)malloc(sizeof(Stack)); s->data = malloc(size * sizeof(int)); s->top = -1; s->size = size; return s; } // 入 void push(Stack* s, int value) { if (s->top == s->size - 1) { printf("Stack is full!\n"); return; } s->data[++s->top] = value; } // 出 int pop(Stack* s) { if (isEmpty(s)) { printf("Stack is empty!\n"); return -1; } return s->data[s->top--]; } // 判断是否为空 int isEmpty(Stack* s) { return s->top == -1; } // 示例 int main() { Stack* stack = initStack(5); push(stack, 10); push(stack, 20); printf("Top element: %d\n", pop(stack)); // 输出:20 free(stack->data); free(stack); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值