栈
只允许在一端进行输入输出操作的线性表。
基本操作
InitStack(&S);
StackEmpty(S);
Push(&S, Element);
Pop(&s, &Element);
GetTop(S, &Element);
ClearStack(&S);
基本操作代码
InitStack
void InitStack(SqStack &s) {
s.top = -1;
}
StackEmpty
bool StackEmpty(SqStack s) {
if (s.top == -1) {
return true;
}
else {
return false;
}
}
Push
bool Push(SqStack &s, ElemType e) {
if (s.top + 1 == MaxSize) {
return false;
}
s.data[++s.top] = e;
return true;
}
Pop
bool Pop(SqStack &s, ElemType &e) {
if (s.top == -1) {
return false;
}
e = s.data[s.top--];
return true;
}
GetTop
bool GetTop(SqStack &s, ElemType &e) {
if (s.top == -1) {
return false;
}
e = s.data[s.top];
return true;
}
问题
- 问题一: 判断一个输入的字符串是否对称?
/* solution.c */
#include <stdio.h>
#include <string.h>
#define MaxSize 50
#define ElemType char
typedef struct {
ElemType data[MaxSize];
int top;
}SqStack;
int main() {
ElemType c;
SqStack s;
InitStack(s);
char str[128];
fgets(str, 127, stdin);
if (isSymmetric(s, str)) {
printf("The squence of string you input is symmetric\n");
}
else {
printf("The squence of string you input is not symmetric\n");
}
return 0;
}
bool isSymmetric(SqStack s, char str[]) {
int len = strlen(str);
str[len - 1] = '\0';
len -= 1;
int i = 0;
ElemType e;
while (i < len / 2) {
Push(s, str[i]);
i++;
}
if (len % 2 == 1) {
i++;
}
while (str[i] != 0) {
Pop(s, e);
if (str[i] != e) {
return false;
}
i++;
}
return true;
}
问题二:
- 假设以I 和 O 分别表示入栈和出栈操作,栈的初态和终态均为空,入栈和出栈的操作序列可表示为均有I和O组成的序列,可以操作的序列成为合法序列,否则称为非法序列,问: 写出一个算法,判断输入的序列是否为合法序列?
#include <iostream>
#include <stdio.h>
#include <vector>
#include <stack>
using namespace std;
bool isCorrent(vector<char> v);
int main(){
vector<char> v;
char c;
while((c = getchar()) != '\n'){
v.push_back(c);
}
bool result = isCorrent(v);
if(result){
printf("The string you input is corrent\n");
} else {
printf("The string you input is not corrent\n");
}
return 0;
}
bool isCorrent(vector<char> v){
int len = v.size();
stack<char> s;
for(int i = 0; i < len; i++){
switch (v[i])
{
case 'I':
s.push('c');
break;
case 'O':
if(s.empty()){
return false;
} else {
s.pop();
}
break;
default:
break;
}
}
if(!s.empty()){
return false;
}
return true;
}
/* 第二种解法 */
bool Judge(char str[]){
int i = 0;
int j = 0;
int k = 0;
while(str[i]!='\0'){
switch(str[i]){
case 'I':
j++;
break;
case 'O':
k++;
if(k > j) return false;
}
i++;
}
if(j!=k){
return false;
} else {
return true;
}
}